【问题标题】:What makes C faster than Python? [closed]是什么让 C 比 Python 更快? [关闭]
【发布时间】:2012-11-30 22:36:18
【问题描述】:

我知道这可能是一个非常明显的答案,而且我将自己暴露在无用的刻薄 cmets 中,但我不知道答案,所以就这样吧。

如果 Python 在运行时编译为字节码,是否只是初始编译步骤需要更长的时间?如果是这种情况,那不只是代码中的一小部分前期成本(即,如果代码运行很长时间,C 和 python 之间的差异会缩小吗?)

【问题讨论】:

标签: python c compilation


【解决方案1】:

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

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

真正的挑战是多次分派(或者任何正确的术语——我不能直截了当),我的意思是,a+b if ab 都是已知的要成为整数或浮点数可以在 C 中编译为一个操作,在 Python 中,您必须做更多的工作来计算 a+b(获取名称绑定到的对象,通过 __add__ 等)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2023-04-07
    • 2010-10-22
    • 2010-10-14
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多