Python 有什么缺点

Python 有什么缺点,第1张

python的整个系统,我其实有非常多的不满。但是用任何一门语言都是取舍问题,如果有一门语言,库够多,已读,易用,性能高,我毫不犹豫立刻转过去。python的强处在于庞大的库,还有非常好的易读和易用性。但是相比来说,性能一直是个问题。python的实现性能大约和C相差五倍上下。如果是大规模计算问题,大约能差10倍以上。当然,我们可以写C扩展,但是这就不是使用python了。我们也可以说,很多时候我们不需要这么快的速度。这是个事实,但是不改变python性能差的事实。 python不但性能差,还有GIL这个玩意。以至于我现在对高并发计算都采取多进程的模式燃渣。多进程模式的通讯效率肯定比多线程低,而且麻烦。

另外,python在底层设计上,也表现出很强的实用主义倾向。这是比较外交术语的词汇,更加直白的说法应当是,混乱,不知所谓。在闭包设计上采用free variable设计,而不是lisp中的environs设计。区别?你试试看在外层闭包中from lib import *。由于引入不定个数名称,free variable无法处理。类似的问题还有LEGB规则,新手往往要花很长时间研究这个例子究竟是怎么错的: a = 1 def f(): print a a = 2 我勒个去,这种反直观反人类的事情都有,还敢说自己易读。

还有坑爹的元编程,这东西根本是坑爹中的坑爹货。如果你用过多重继承,大概就知道python的整个OO系统看起来根本是大型的仿真,到处都是乱糟糟的。C++怎么解决多重继承的?你最好别用(真心说,这可比python更加坑皮指悄爹)。java怎么解决多重继承的,只能继承Interface。其实这是变相的变成了Interface-Implement模式。python怎么解决的?MRO!为什麽一个类加个__metaclass__就会改变性质啊,为什麽一个类去生成另一个类的写法是——我基本不记得了,反正web.py里面有用到,需要的话去炒栗子吧。为什麽方法要隐藏居然要改名字加__啊。你到底是在做OO还是在看起来像OO的东西上狂打补丁啊魂淡。

lambda表达式弱智。我和人讨论过,lambda是否是图灵完备的。结论还是完备的,不过需要借助Y combinator。何必呢?由于强调lambda的快速特性,因此将lambda强制在一行以内(没有结束标记),导致python其实是没有匿逗档名函数的。一个callback数组写的难过死。

语法糖太多了点,当然,这是纯粹的个人感觉。语法糖是把双刃剑,用的好,可以简化编写和阅读,但是太多,往往容易引入语法混乱和额外的约束。

另外,语言的自构建特性混乱。虽说不是每门语言都强调自构建特性,但是通常而言,都是使用C实现一个内核,由内核实现一些基础 *** 作。再由基础 *** 作实现更复杂的 *** 作。每层的边界都是比较清晰的。谁来告诉我,python中有多少库在移植时是由纯python实现的?库的相互依赖层级是?

python的沙盒化也是个问题,如果沙盒做的够好,我完全可以把python作为一个客户级别的平台。用C写一个很简单的类似浏览器的东西,下载一个URL的python包回去运行(或者仅仅检查更新)。从而保证本地效果/跨平台/安全性。现在?一个都保证不了。我连把一个python包转移到另一台同构设备上都很麻烦(如果两者不是严格匹配,例如系统差异,系统版本差异)无论是web开发还是移动终端开发都必须走传统模式。

1. - 运行速度慢,因为Python是解释型语言,是一种高级语言,代码会在执行的时候,一行一行的使用解释器翻译成底层代码,翻译成机器码,而这个过程非常耗时,所以他运行过程中兆庆,比很多语言的代码都慢了很多。

- 线程不能利用多CPU,这是Python最大的确定,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是 *** 作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由 *** 作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用派猜缺户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。

Python的优缺点可以看看传智播客的社区,里面很多技术老师写的相关文章。并且有学习线路图适合小白学习,每个尘辩板块下面都有配套视频。

安装前准备

编译Python之前您最好先安装一系列的开发工具和一些拓展库,虽然不是必须的,但这样Python才能依赖这些工具和拓展库展示它强悍的功能。下面是利用yum进行工具和拓展库安装的示例命令,直接copy执行即可(注意部分命令显示不全,但可以通过移动光标查看和复制)。

yumgroupinstall"Development tools"

yuminstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devel

该考虑的因素

在您编译和安装Python之前,有些东西您是应该知道或考虑的。如下。

Unicode编码

Python编码问题历史悠久,但不用过多关注,知道它目前支持Unicode编码即可(Python3中默认的)。考虑到兼容性等原因,除非有特殊的理伍咐由,您最好配置下Python

3.2和更早的版本,使其支持UTF-32编码,虽然会增加小小的内存代价。在Python 2.7中您可以通过在configure时添加选项--enable-unicode=ucs4 进行配置,而在Python 3.2中是--with-wide-unicode选项。

Shared library(动态共享库)

目前大部分的Linux系统自带的Python都是以共享库的方式编译的,

此外,某些第三方工具例如mod_wsgi和Blender,没有Python的共享库还运行不了,所以,您最好还是把Python编译成动态共享库吧。为了以共享库方式编译Python,您必须指明共享库的路径。您有两种选择:

在configure命令后面添加:LDFLAGS="-Wl,-rpath /usr/local/lib"从而将库路径直接编激蔽译进Python中。

以记事本方式打开 /etc/ld.so.conf ,然后在文件最后添加新行:/usr/local/lib 。紧接着运行命令 /sbin/ldconfig 更新动态链接器。 添加后的文件内容在CentOS 6.5 如下:

/etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/local/lib

使用 “make altinstall” 而不是make install

切记,在安装自定义版本的Python时,make altinstall命令是必须的!如果您使用一般的 make install命令,呵呵,您将会在解压编译的目录下看到两个命名一样但版本不同的python,这有可能会导致一些意想不到的bug哦,具体是什么作者没说,我也不知道。

下载,编译,安装Python

如下命令可用于下载、编译和安装Python。注意,如果您打算安装后手明橘州动修改/etc/ld.so.conf文件以更新动态链接器,那么下面的 LDFLAGS 参数您就可以去掉了。

# Python 2.7.6:

wgethttp://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz

tarxfPython-2.7.6.tar.xz

cdPython-2.7.6

./configure--prefix=/usr/local--enable-unicode=ucs4--enable-sharedLDFLAGS="-Wl,-rpath /usr/local/lib"

make&&makealtinstall(此处切记,要么以root运行,要么分开执行!)

# Python 3.3.5:

wgethttp://python.org/ftp/python/3.3.5/Python-3.3.5.tar.xz

tarxfPython-3.3.5.tar.xz

cdPython-3.3.5

./configure--prefix=/usr/local--enable-sharedLDFLAGS="-Wl,-rpath /usr/local/lib"

make&&makealtinstall(此处切记,要么以root运行,要么分开执行!)

执行上述命令之后,您可以在/usr/local/bin/python2.7或 /usr/local/bin/python3.3中找到新安装的Python。而Python 2.6.6则可能在/usr/bin/python, /usr/bin/python2或 /usr/bin/python2.6找到。

下载和安装Setuptools + pip

Setuptools早已取代 Distribute成为Python官方的拓展包管理器,以用于从Python Package Index安装拓展功能包。 不同版本的Python需要的Setuptools版本不同。建议您也通过Setuptools安装 pip,它提供了一些额外在安装拓展功能包时很有用的功能。

以下的命令可用于安装最新版Setuptools 和 pip。

# First get the setup script for Setuptools:

wgethttps://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

# Then install it for Python 2.7 and/or Python 3.3:

python2.7ez_setup.py

python3.3ez_setup.py

# Now install pip using the newly installed setuptools:

easy_install-2.7pip

easy_install-3.3pip

# With pip installed you can now do things like this:

pip2.7install[packagename]

pip2.7install--upgrade[packagename]

pip2.7uninstall[packagename]

安装的拓展功能包在/usr/local/lib/pythonX.Y/site-packages/中可以找到(X.Y是Python的版本号)。

接下来干嘛?

如果您使用 Python 2.7,强烈建议您安装virtualenv并学会使用它,它可用于创建独立的 Python 环境。如果您使用 Python 3.3的话就可以省心些,它已被内置了。

不同的

Python 运行环境(也叫沙盒) 可以有自己的 Python

版本和拓展功能包,就是说不同的Python安装和运行的目录不同,也可以为每个版本的Python安装对应的名称一样但版本不同的拓展包。

这在开发多个功能不同的项目或在同一个项目中需要用到不同版本的Python是会很有用的。

创建您第一个独立的Python环境

# Install virtualenv for Python 2.7 and create a sandbox called my27project:

pip2.7installvirtualenv

virtualenv-2.7my27project

# Use the built-in pyvenv program in Python 3.3 to create a sandbox called my33project:

pyvenv-3.3my33project

# Check the system Python interpreter version:

python--version

# This will show Python 2.6.6

# Activate the my27project sandbox and check the version of the default Python interpreter in it:

sourcemy27project/bin/activate

python--version

# This will show Python 2.7.6

deactivate

# Activate the my33project sandbox and check the version of the default Python interpreter in it:

sourcemy33project/bin/activate

python--version

# This will show Python 3.3.5

deactivate

当你使用

virtualenv创建一个运行沙盒时,它会自动在沙盒环境中为您安装setuptools和 pip

(听起来不错,可以还没尝试过)。但如果您使用 pyvenv

的话,您就必须自己动手安装了。也简单,激活沙盒之后通过运行下载的z_setup.py文件去安装即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12341145.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存