是什么让C比Python更快?

Chr*_*ris 7 c python compilation

我知道这可能是一个非常明显的答案,而且我将自己暴露给不那么有用的讽刺评论,但我不知道答案所以这里就是这样.

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

DSM*_*DSM 16

这不仅仅是因为Python代码被解释而使其变慢,尽管这肯定会限制你获得的速度.

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

真正的挑战是多次派遣(或任何正确的行话 - 我不能保持一切直线),我的意思是这样的事实,即a+b如果ab已知是整数或浮点数可以编译为一个操作C,在Python中你必须做更多的事情来计算a+b(获取名称绑定的对象,通过__add__等)

这就是为什么要使Cython达到C速度,你必须在关键路径中指定类型; 这就是Shedskin如何使用(笛卡尔积)类型推断快速生成Python代码以从中获取C++; 以及PyPy如何快速--JIT可以关注代码的行为方式,并专注于类型之类的东西.无论是在编译时还是在运行时,每种方法都消除了动态,因此它可以生成知道它正在做什么的代码.


fus*_*sha 7

字节代码对CPU来说并不自然,因此它们需要解释(通过称为解释器的CPU本机代码).字节代码的优点是它可以实现优化,预计算和节省空间.C编译器生成机器代码,机器代码不需要解释,它是CPU原生的.