python为啥运行效率不高
原因:1、python是动态语言;2、python是解释执行,但不支持JIT;3、python中的一切都是对象,每个对象都需要维护引用计数,以增加额外的工作。4、python GIL;5、垃圾回收。

当我们提到编程语言的效率时:通常有两层含义,一是开发效率,这是程序员完成编码所需的时间;另一种是操作效率,这是计算机完成计算任务所需的时间。编码效率和操作效率往往是鱼和熊掌之间的关系,很难同时考虑。不同的语言会有不同的焦点,python语言无疑更关心编码效率,life is short,we use python。
虽然使用python的编程人员应该接受其运行效率低下的事实,但python在越来越多的领域得到了广泛的应用,如科学计算 、web服务器等。程序员当然也希望python能更快地操作,python能更强大。
首先,与其他语言相比,python的速度有多慢,不同的场景和测试用例的结果肯定是不同的。该网站在各种case下对不同语言的性能进行了比较。本页是python3和C++之间的比较。以下是两个case:

从上图可以看出,不同的case,python比C++慢了几倍到几十倍。
python操作效率低的具体原因是什么?以下是一些列表:
第一:python是动态语言
只有在运行过程中确定变量指向对象的类型,编译器无法做出任何预测,也无法优化。举个简单的例子: r = a + b。 A和B加起来,但是A和B的类型只有在运行的时候才知道。对于加法操作,不同的类型有不同的处理方法,所以每次运行都会判断A和B的类型,然后执行相应的操作。在C++等静态语言中,操作代码是在编译时确定的。
另一个例子是属性搜索,在python属性搜索中详细介绍了具体的搜索顺序。简而言之,访问对象的属性是一个非常复杂的过程,通过相同的变量访问的python对象可能会有所不同(见Lazy) property的例子)。在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机器学习(Mooc礼欣,嵩天教授)
