知行编程网知行编程网  2022-10-25 20:30 知行编程网 隐藏边栏  8 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python为啥运行效率不高的相关知识,包括C和python效率对比,以及python运行速度慢这些编程知识,希望对大家有参考作用。

理由:1、Python是动态语言; 2. Python被解释执行,但不支持JIT; 3、python中的一切都是对象,每个对象都需要维护一个引用计数,增加了额外的工作量。 4、python GIL; 5、垃圾回收。

为什么python没有高效运行?

当我们提到一种编程语言的效率时:通常有两个含义,一是开发效率,即程序员完成编码所花费的时间;另一个是运行效率,也就是完成一个计算任务所需的时间。编码效率和运行效率往往是鱼和熊掌的问题,很难同时兼顾。不同的语言有不同的侧重点。 python语言无疑更关心编码效率。人生苦短,我们用python。

虽然使用python的程序员应该接受它效率低下的事实,但是python被越来越广泛的应用在越来越多的领域,比如科学计算、web服务器等。当然,程序员也希望python能够运行得更快,也希望python能够变得更强大。

首先python相比其他语言有多慢,不同的场景和测试用例的结果肯定是不一样的。这个网址给出了不同语言在各种情况下的性能对比。这个页面是python3和C++的比较。以下是两种情况:

为什么python没有高效运行?

从上图可以看出,不同的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%。感兴趣的读者可以去细读。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享