python为啥运行效率不高
python运算效率低,具体是什么原因呢,下列罗列一些:
原因:1、python是动态语言;2、python是解释执行,但是不支持JIT;3、python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。4、pythonGIL;5、垃圾回收。
第一:python是动态语言
一个变量所指向对象的类型在运行时才确定,编译器做不了任何预测,也就无从优化。举一个简单的例子:r=a+b。a和b相加,但a和b的类型在运行时才知道,对于加法操作,不同的类型有不同的处理,所以每次运行的时候都会去判断a和b的类型,然后执行对应的操作。而在静态语言如C++中,编译的时候就确定了运行时的代码。
另外一个例子是属性查找,关于具体的查找顺序在《python属性查找》中有详细介绍。简而言之,访问对象的某个属性是一个非常复杂的过程,而且通过同一个变量访问到的python对象还都可能不一样(参见Lazyproperty的例子)。而在C语言中,访问属性用对象的地址加上属性的偏移就可以了。
第二:python是解释执行,但是不支持JIT(justintimecompiler)。虽然大名鼎鼎的google曾经尝试UnladenSwallow这个项目,但最终也折了。
第三:python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。
第四:pythonGIL,GIL是Python最为诟病的一点,因为GIL,python中的多线程并不能真正的并发。如果是在IObound的业务场景,这个问题并不大,但是在CPUBOUND的场景,这就很致命了。所以笔者在工作中使用python多线程的情况并不多,一般都是使用多进程(prefork),或者在加上协程。即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode(默认,可以通过sys.setcheckinterval()设置)就会尝试线程的切换,具体的源代码在ceval.c::PyEval_EvalFrameEx。
第五:垃圾回收,这个可能是所有具有垃圾回收的编程语言的通病。python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡。infoq上有一篇文章,提到禁用Python的GC机制后,Instagram性能提升了10%。感兴趣的读者可以去细读。
以上内容为大家介绍了Python增强,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。
相关推荐HOT
更多>>Python 枚举
1.枚举的定义首先,定义枚举要导入enum模块。枚举定义用class关键字,继承Enum类。用于定义枚举的class和定义类的class是有区别【下一篇博文继...详情>>
2023-11-06 13:46:00Python多核编程mpi4py实践
一、概述CPU从三十多年前的8086,到十年前的奔腾,再到当下的多核i7。一开始,以单核cpu的主频为目标,架构的改良和集成电路工艺的进步使得cpu...详情>>
2023-11-06 09:21:36python之增量式爬虫是什么?
引言:当我们在浏览相关网页的时候会发现,某些网站定时会在原有网页数据的基础上更新一批数据,例如某电影网站会实时更新一批最近热门的电影。...详情>>
2023-11-06 07:21:56Python之父Guido谈Python的未来
Python在移动计算领域的应用Guido:移动对Python来说仍是一个很难啃下来的平台,但是并没有浏览器平台的难度大,因为Python实际上是可以运行在...详情>>
2023-11-06 02:14:20