是什么让C比Python更快?

时间:2012-12-13 04:39:44

标签: python c compilation

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

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

2 个答案:

答案 0 :(得分:13)

不仅仅是Python代码的解释使得它变得更慢,尽管这肯定会限制你获得的速度。

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

真正的挑战是多次发送(或者任何正确的行话 - 我都不能保持一致),我的意思是a+b如果ab a+b都是已知的整数或浮点数可以编译为C中的一个op,在Python中你必须做更多的事情来计算__add__(获取名称绑定的对象,去通过{{1}}等。)

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

答案 1 :(得分:6)

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