che*_*gpc 4 c c++ python optimization performance
简单地在python和C++中运行一个近空的for循环(如下所示),速度非常不同,python慢了一百多倍.
a = 0
for i in xrange(large_const):
a += 1
Run Code Online (Sandbox Code Playgroud)
int a = 0;
for (int i = 0; i < large_const; i++)
a += 1;
Run Code Online (Sandbox Code Playgroud)
另外,我该怎么做才能优化python的速度?
(另外:我在这个问题的第一个版本中做了一个不好的例子,我并不是说a = 1因此C/C++编译器可以优化它,我的意思是循环本身消耗了大量资源(也许我应该使用+ = 1作为示例.. ..我的意思是如何优化是如果for循环就像一个+ = 1那么简单,它怎么能以与C/C++类似的速度运行?在我的练习,我使用了Numpy所以我不能再使用pypy了(现在),是否有一些通用的方法可以更快地制作循环(例如生成列表中的生成器)?)
mgi*_*son 11
一个聪明的C编译器可能可以优化你的循环路程承认,在年底,a将始终为1 Python不能做遍历时,因为xrange,它需要调用__next__上的xrange对象,直到它引发StopIteration.python无法知道在__next__调用它之前是否会产生副作用,因此无法优化循环.本段的内容消息是,优化Python"编译器"而不是C编译器更加困难,因为python是一种动态语言,需要编译器知道对象在某些情况下的行为方式.在C中,这更容易,因为C确切地知道每个对象提前的类型.
当然,除了编译器之外,python还需要做更多的工作.在C,您使用硬件指令支持的操作来处理基类型.在python中,解释器在软件中一次解释一行字节码.显然,这需要比机器级指令更长的时间.并且数据模型(例如__next__一遍又一遍地调用)也可以导致许多函数调用,而C不需要这样做.当然,python做这件事使它比编译语言更灵活.
加速python代码的典型方法是使用库或内部函数,它们为低级编译代码提供高级接口. scipy并且numpy是这种图书馆的极好例子.您可以查看的其他内容pypy包括使用JIT编译器 - 您可能无法达到本机速度,但它可能胜过Cpython(最常见的实现),或使用Cpython-API在C/fortran中编写扩展,cython或f2py用于性能关键的代码段.
仅仅因为Python是一种更高级的语言,并且必须在每次迭代时做更多不同的事情(比如获取锁,解析变量等)
"如何优化"是一个非常模糊的问题.没有"通用"方法来优化任何Python程序(Python的开发人员已经完成了所有可能的工作).您可以通过以下方式优化您的特定示例:
a = 1
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这就是任何C编译器都会做的.
如果你的程序使用数字数据,那么使用numpy它和它的矢量化例程通常会给你带来很好的性能提升,因为它在纯C中做了所有事情(使用C循环而不是Python循环)并且不必采用解释器锁和所有这些东西.