千锋教育-做有情怀、有良心、有品质的职业教育机构

python为啥运行效率不高

来源:千锋教育
发布时间:2023-11-08 10:57:23
分享

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培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • 找不出python的语法错误该如何解决? python是一种解释型语言,在开发中,没有了编译这个环节。大部分脚本语言都是解释型语言。没有了编译这个环节,在开发过程中,就无法知道自己所写代码的语法正确性,只有实际执行代码才知道语法是否正确。这样
  • python怎么创建模块? python创建自己的模块很方便,所有的.py文件都被视为是一个模块。它可以包含变量、类、函数和python脚本中可用到的其他任何元素。创建模块:首先创建一个文件a.py,里面有一个类A#coding
  • python如何获取字典中的keys? python中可以使用keys()方法获取字典中的键,Python字典keys()方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有的键。keys()方法语法:D.k
  • python中如何提高计算速度? 下面是python中的一个函数计算代码:loops=25000000frommathimport*a=range(1,loops)deff(x):return3*cos(x)+4*sin(x)**2%
  • python怎么判断文件夹下是否存在文件? python判断文件夹下是否存在文件的方法:1、使用os.path.exists()方法判断文件是否存在importosos.path.exists(test_file.txt)#Trueos.pat
  • python缩进长度统一吗? python对代码的缩进要求非常严格,同一个级别代码块的缩进量必须一样,否则解释器会报SyntaxError异常错误。在Python中,对于类定义、函数定义、流程控制语句、异常处理语句等,行尾的冒号和