是什么让C比Python快?

是什么让C比Python快?,python,c,compilation,Python,C,Compilation,我知道这可能是一个非常明显的答案,我让自己暴露在没有什么帮助的尖刻评论中,但我不知道答案,所以就这样说吧 如果Python在运行时编译成字节码,是否只是初始编译步骤需要更长的时间?如果是这样的话,那么代码中的前期成本不是很小吗(即如果代码运行时间很长,C和python之间的差异是否会减小?字节码对CPU来说不是自然的,因此它们需要解释(由一个称为解释器的CPU本机代码)。字节码的优点是它支持优化、预计算和节省空间。C编译器产生机器代码,而机器代码不需要解释,它是CPU固有的 不仅仅是Python

我知道这可能是一个非常明显的答案,我让自己暴露在没有什么帮助的尖刻评论中,但我不知道答案,所以就这样说吧


如果Python在运行时编译成字节码,是否只是初始编译步骤需要更长的时间?如果是这样的话,那么代码中的前期成本不是很小吗(即如果代码运行时间很长,C和python之间的差异是否会减小?

字节码对CPU来说不是自然的,因此它们需要解释(由一个称为解释器的CPU本机代码)。字节码的优点是它支持优化、预计算和节省空间。C编译器产生机器代码,而机器代码不需要解释,它是CPU固有的

不仅仅是Python代码被解释这一事实使其速度变慢,尽管这肯定会限制您的速度

如果以字节码为中心的观点是正确的,那么要使Python代码像C一样快,您所要做的就是用对函数的直接调用替换解释器循环,消除任何字节码,并编译生成的代码。但它不是那样工作的。你也不必相信我的话:你可以自己测试一下。Cython将Python代码转换为C,但转换后编译的典型Python函数并没有显示C级速度。您所要做的就是查看一些这样产生的典型C代码,以了解原因

真正的挑战是多重分派(或者不管正确的术语是什么——我不能把它说得一清二楚),我的意思是,尽管
a+b
如果
a
b
都是已知的整数,或者float可以在C中编译成一个op,但在Python中,你必须做更多的工作来计算
a+b
(获取名称绑定到的对象,通过
\uuuuu add\uuuu
等)


这就是为什么要使Cython达到C速度,必须指定关键路径中的类型;这就是Shedskin使用(笛卡尔积)使Python代码快速的原因从中获得C++的类型推断;以及PyPy如何快速实现。JIT可以注意代码的行为和专门化的类型。每种方法都消除了动态性,无论是在编译时还是在运行时,都可以生成知道它正在做什么的代码。这里有一个很好的解释[这里][1][1]:另外,这里有一些相关基准的想法:谢谢……现在我在这里挖掘