为什么python中的琐碎循环比C ++中的慢得多?以及如何优化呢?[重复]
问题内容:
这个问题已经在这里有了答案 :
为什么Python程序通常比C或C ++编写的等效程序慢? (9个答案)
7年前关闭。
只需在python和C ++(如下所示)中运行几乎为空的for循环,速度就大不相同,python的速度要慢100倍以上。
a = 0
for i in xrange(large_const):
a += 1
int a = 0;
for (int i = 0; i < large_const; i++)
a += 1;
另外,我该怎么做才能优化python的速度?
(另外:我在这个问题的第一个版本中做了一个不好的例子,我并不是真的说a = 1以便C / C
编译器可以优化它,我的意思是循环本身消耗了很多资源(也许我应该使用a + = 1作为示例。.我的意思是,如果for循环就像一个简单的+ =
1一样,怎么能以与C / C
相似的速度运行?实践中,我使用了Numpy,所以现在不再使用pypy,有没有一些通用的方法可以使循环更快得多(例如生成列表中的generator)?)
问题答案:
一个聪明的C编译器能够通过识别,在年底,可能优化循环客场a
始终为1
Python不能这样做,因为当循环访问xrange
,需要调用__next__
上的xrange
对象,直到它引发StopIteration
。python__next__
在调用它之前不知道是否会有副作用,因此无法优化循环。本段的要点是,与C编译器相比,优化Python“编译器”是非常困难的,因为python是一种动态语言,需要编译器知道对象在某些情况下的行为。在C中,这要容易得多,因为C提前知道每个对象的类型。
当然,除了编译器,python还需要做更多的工作。在中C
,您正在使用 硬件说明中 支持的操作来处理基本类型。在python中,解释器在
软件中
一次解释一行字节码。显然,这将花费比机器级指令更长的时间。数据模型(例如__next__
,一遍又一遍地调用)也可以导致很多C不需要做的函数调用。当然,python做了这些工作,使其比您在编译语言中拥有的灵活性更高。
加快python代码速度的典型方法是使用库或内在函数,这些库或内在函数为低级编译代码提供高级接口。
scipy
并且numpy
是此类库的出色示例。您可以查看使用的其他内容,pypy
其中包括JIT编译器-
您可能无法达到本机速度,但是它可能会击败Cpython(最常见的实现),或者使用Cpython-API在C /
fortran中编写扩展,cython或f2py用于代码的性能关键部分。