Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python中的平凡循环比C+中的循环运行得慢得多+;?如何优化这一点? 在Python和C++中简单地运行一个空的for循环(如下),速度非常不同,Python慢了一百倍。 a=0 对于X范围内的i(大常数): a+=1 inta=0; 对于(int i=0;i_C++_Python_C_Performance_Optimization - Fatal编程技术网

为什么python中的平凡循环比C+中的循环运行得慢得多+;?如何优化这一点? 在Python和C++中简单地运行一个空的for循环(如下),速度非常不同,Python慢了一百倍。 a=0 对于X范围内的i(大常数): a+=1 inta=0; 对于(int i=0;i

为什么python中的平凡循环比C+中的循环运行得慢得多+;?如何优化这一点? 在Python和C++中简单地运行一个空的for循环(如下),速度非常不同,Python慢了一百倍。 a=0 对于X范围内的i(大常数): a+=1 inta=0; 对于(int i=0;i,c++,python,c,performance,optimization,C++,Python,C,Performance,Optimization,另外,我可以做些什么来优化python的速度 (补充: 在这个问题的第一个版本中,我举了一个很糟糕的例子,我不是说a=1,这样C/C++编译器就可以优化它,我是说循环本身消耗了很多资源(也许我应该用a+=1作为例子)…我的意思是如何优化,如果for循环像a++=1那么简单,它怎么能以与C/C++类似的速度运行?在我的实践中,我使用了Numpy,所以我不能再使用pypy了(现在),是否有一些通用方法可以更快地生成循环(例如生成列表中的生成器)? )Python(通常)是一种解释语言,这意味着在运行

另外,我可以做些什么来优化python的速度

(补充: 在这个问题的第一个版本中,我举了一个很糟糕的例子,我不是说a=1,这样C/C++编译器就可以优化它,我是说循环本身消耗了很多资源(也许我应该用a+=1作为例子)…我的意思是如何优化,如果for循环像a++=1那么简单,它怎么能以与C/C++类似的速度运行?在我的实践中,我使用了Numpy,所以我不能再使用pypy了(现在),是否有一些通用方法可以更快地生成循环(例如生成列表中的生成器)? )

Python(通常)是一种解释语言,这意味着在运行时必须逐行读取脚本,并将其指令编译成可用的字节码

C(通常)是一种编译语言,所以当您运行它时,您使用的是纯机器代码

因此,Python永远不会像C一样快


编辑:事实上,python在运行时编译成C代码,这就是为什么会得到这些.pyc文件。

原因很简单,因为python是一种更高级的语言,每次迭代都要做更多不同的事情(比如获取锁、解析变量等)

“如何优化”是一个非常模糊的问题。没有“通用”的方法来优化任何Python程序(Python开发人员已经完成了所有可能的工作)。您的特定示例可以通过以下方式进行优化:

a = 1
顺便说一句,这是任何C编译器都会做的


如果您的程序使用数字数据,那么使用
numpy
及其矢量化例程通常会给您带来极大的性能提升,因为它在纯C中完成所有操作(使用C循环,而不是Python循环)而且不需要使用解释器锁和所有这些东西。

一个智能C编译器可能会通过认识到最后,
A
将始终是1来优化循环。Python无法做到这一点,因为当在
xrange
上迭代时,它需要在
xrange
对象上调用
\uuuuuuuuuuuuuuuu
,直到它引发
StopIteration
。python在调用它之前无法知道
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。本段的要点是,优化Python“编译器”比优化C编译器要困难得多,因为Python是一种动态语言,需要编译器知道对象在某些情况下的行为。在里面
C、 这要容易得多,因为C提前准确地知道每个对象的类型

当然,撇开编译器不谈,python需要做更多的工作。在
C
中,您正在使用硬件指令中支持的操作来处理基类型。在python中,解释器在软件中一次解释一行字节码。显然,这将需要比机器级指令更长的时间。而且数据模型(例如,反复调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)也会导致大量C不需要执行的函数调用。当然,python做这些事情是为了使它比编译语言灵活得多


提高python代码速度的典型方法是使用库或内部函数,它们为低级编译代码提供高级接口
scipy
numpy
是此类库的优秀示例。您可以研究的其他方面包括使用JIT编译器——您可能无法达到本机速度,但它可能会超过Cpython(最常见的实现),或者使用Cpython API在C/fortran中编写扩展,cython或f2py用于代码的性能关键部分。

越抽象,速度越慢。最快的代码是直接编写的汇编代码


阅读这个问题

相关:C代码可以优化吗?试试
volatile int a在C版本中,以防止循环被删除。尝试使用volatile,在a+=1中也是如此,速度比python快数百倍……这是不正确的,python代码在第一次读取时被编译为字节码,因此它对
循环的性能没有直接影响。C通常是一种编译语言吗?它不是一直都是编译语言吗?@tobi-看看。还有其他C/C++解释器。请参阅问题:是否有C
解释器。pyc
文件包含CPython中包含的VM字节码。没有Python实现在运行时将Python编译为C。一些Python派生语言(Cython,Shedskin等)被编译成C或C++,Nuika将Python编译成C++,但它们是1。模糊的,2。不是Python(Nuitka除外)和2。提前编译,而不是在运行时。即使编译完全未优化,C代码也会显著加快。因为python是一种更高级的语言,python中有很多计算和表示的包袱,而C语言中没有。内容的循环空白暴露了很多包袱。@DavidHammen——我想我在第二段中解释过……:)我在这里举了一个很糟糕的例子,我并不是说a=1,这样编译器就可以优化它,我是说循环本身消耗了很多资源(也许我应该用a+=1作为例子)。。我所说的优化是,如果for循环这么简单,它怎么能以与C/C++类似的速度运行呢?在我的实践中,我使用了numpy,所以我不能再使用pypy了,是否有一些通用的方法可以更快地生成循环(例如生成列表中的生成器)?@c