什么使得C语言比Python更快?

9
我知道这可能是一个非常显然的答案,而且我也会面对一些不太有帮助的嘲讽评论,但是我不知道答案,所以就在这里问一下。
如果Python在运行时编译成字节码,那么只需要一开始的编译步骤花费更长的时间吗?如果是这样的话,那岂不是代码中的一小部分(例如,如果代码运行的时间很长,那么C和Python之间的差异会减少)?

2
Byecode距离C编译成的机器码仍有很长的路要走。 - goji
2
这里有一个很好的解释。 - MFlamer
另外,这里有一些相关基准测试的想法:https://www.quora.com/Why-does-C-code-run-faster-than-Pythons - Eduardo Pignatelli
2个回答

18

Python 代码被解释执行并不是唯一导致其较慢的原因,尽管这确实限制了它的速度。

如果以字节码为中心的观点是正确的,那么要想让 Python 代码像 C 语言一样快,你只需要用直接调用函数替换解释器循环,消除任何字节码,并编译出结果代码即可。但实际情况并非如此。不必完全相信我的话:你可以亲自测试。Cython 将 Python 代码转换为 C 代码,但通常情况下,转换并编译后的典型 Python 函数并不会表现出 C 级别的速度。只需查看所生成的一些典型 C 代码,便能看出原因。

真正的挑战在于多重分派(或者说是合适的术语——我记不清楚这些),我的意思是,当 a+b 的类型都已知为整数或浮点数时,在 C 中可以将其编译成一个操作符,但在 Python 中,计算 a+b 需要做更多的事情(获取名称所绑定的对象,通过 __add__ 等方式)。

这就是为什么要让 Cython 达到与 C 相同的速度,你必须在关键路径中指定类型;这也是 Shedskin 使用(笛卡尔积)类型推理将 Python 代码转换为 C++ 代码,从而加速的方式;PyPy 以及它的 JIT 能够根据代码的行为情况进行特化处理,如类型处理。每种方法都消除了动态性,无论是在编译时还是在运行时,以便生成知道自己在做什么的代码。


9

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


谢谢...现在我正在这里深入挖掘https://dev59.com/BHVC5IYBdhLWcg3w9GA9 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接