理由:1、Python是动态语言; 2. Python被解释执行,但不支持JIT; 3、python中的一切都是对象,每个对象都需要维护一个引用计数,增加了额外的工作量。 4、python GIL; 5、垃圾回收。
当我们提到一种编程语言的效率时:通常有两个含义,一是开发效率,即程序员完成编码所花费的时间;另一个是运行效率,也就是完成一个计算任务所需的时间。编码效率和运行效率往往是鱼和熊掌的问题,很难同时兼顾。不同的语言有不同的侧重点。 python语言无疑更关心编码效率。人生苦短,我们用python。
虽然使用python的程序员应该接受它效率低下的事实,但是python被越来越广泛的应用在越来越多的领域,比如科学计算、web服务器等。当然,程序员也希望python能够运行得更快,也希望python能够变得更强大。
首先python相比其他语言有多慢,不同的场景和测试用例的结果肯定是不一样的。这个网址给出了不同语言在各种情况下的性能对比。这个页面是python3和C++的比较。以下是两种情况:
从上图可以看出,不同的case,python比C++慢了几倍到几十倍。
python运算效率低,具体是什么原因呢,下列罗列一些:
第一:python是动态语言
变量指向的对象的类型是在运行时确定的,编译器无法做出任何预测,因此无法进行优化。举个简单的例子:r = a + b。 a 和 b 被添加,但 a 和 b 的类型仅在运行时才知道。对于加法运算,不同的类型有不同的处理,所以每次运算都会判断a和b的类型,然后进行相应的运算。 .在 C++ 等静态语言中,运行时代码是在编译时确定的。
另一个例子是属性搜索。具体搜索顺序在“python属性搜索”中有详细说明。总之,访问一个对象的一个属性是一个非常复杂的过程,通过同一个变量访问的python对象可能是不同的(参见Lazy属性的例子)。在C语言中,对象的地址用于访问属性加上属性的偏移量。
第二:python是解释执行,但是不支持JIT(just in time compiler)
。虽然大名鼎鼎的google曾经尝试Unladen Swallow 这个项目,但最终也折了。
第三:python中的一切都是对象,每个对象都需要维护一个引用计数,增加了额外的工作量。
第四:
python GIL
,GIL是Python最为诟病的一点,因为GIL,python中的多线程并不能真正的并发。如果是在IO bound的业务场景,这个问题并不大,但是在CPU BOUND的场景,这就很致命了。所以笔者在工作中使用python多线程的情况并不多,一般都是使用多进程(pre fork),或者在加上协程。即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode(默认,可以通过sys.setcheckinterval()设置)就会尝试线程的切换,具体的源代码在ceval.c::PyEval_EvalFrameEx。
第五:垃圾回收
,这个可能是所有具有垃圾回收的编程语言的通病。python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡。infoq上有一篇文章,提到禁用Python的GC机制后,Instagram性能提升了10%。感兴趣的读者可以去细读。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中使用匿名函数?01/09
- ♥ 如何用python猜数字10/04
- ♥ python生成器切片的实现10/09
- ♥ windows无法启动mongodb服务如何解决11/03
- ♥ Python 的 zip() 函数是什么09/25
- ♥ python输入身高和体重来计算BMI08/24
内容反馈