当我们提到一种编程语言的效率时:通常有两个含义,一是开发效率,即程序员完成编码所花费的时间;另一个是运行效率,也就是完成一个计算任务所需的时间。编码效率和运行效率往往是鱼和熊掌的问题,很难同时兼顾。不同的语言有不同的侧重点。 python语言无疑更关心编码效率。人生苦短,我们用python。
虽然使用python的程序员应该接受它效率低下的事实,但是python被越来越广泛的应用在越来越多的领域,比如科学计算、web服务器等。当然,程序员也希望python能够运行得更快,也希望python能够变得更强大。相比之下,C语言的效率要高于python。
首先python相比其他语言有多慢,不同的场景和测试用例的结果肯定是不一样的。这个网址给出了不同语言在各种情况下的性能对比。这个页面是python3和C++的比较。以下是两种情况:
从上图可以看出,不同的case,python比C++慢了几倍到几十倍。
python运算效率低,具体是什么原因呢,下列罗列一些:
第一:python是动态语言
变量指向的对象的类型是在运行时确定的,编译器无法做出任何预测,因此无法进行优化。举个简单的例子:r = a + b。 a 和 b 被添加,但 a 和 b 的类型仅在运行时才知道。对于加法运算,不同的类型有不同的处理,所以每次运算都会判断a和b的类型,然后进行相应的运算。 .在 C++ 等静态语言中,运行时代码是在编译时确定的。
第二:python被解释执行,但不支持JIT(即时编译器)。虽然著名的 google 曾经尝试过 Unladen Swallow 项目,但最终还是放弃了。
第三:python中的一切都是对象,每个对象都需要维护一个引用计数,增加了额外的工作量。
第四:python GIL,GIL是Python最被诟病的一点,因为GIL,python中的多线程不能真正并发。如果是IO绑定的业务场景,这个问题不是什么大问题,但是在CPU BOUND场景下,就是致命的了。因此,我在工作中使用 python 多线程的情况并不多。一般来说,我使用多处理(pre fork),或者添加协程。即使在单线程中,GIL 也会对性能产生很大影响,因为 python 会尝试每 100 个操作码切换线程(默认情况下,可以通过 sys.setcheckinterval() 设置),具体源码在 ceval.c 中: :PyEval_EvalFrameEx。
第五:垃圾回收,这可能是所有带有垃圾回收的编程语言的通病。 Python 采用了标记和分代的垃圾回收策略,每次垃圾回收都会中断正在执行的程序,造成所谓的停顿。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python if语句如何结束08/17
- ♥ python文件运行后自动退出怎么办?09/16
- ♥ 如何在 Python 中安装 xlwt08/20
- ♥ python的源文件在哪里编辑?11/11
- ♥ python静态方法和类方法有什么区别08/18
- ♥ Python中Series的常用方法11/06
内容反馈