我知道这可能是一个非常明显的答案,而且我让自己暴露在无益的尖锐评论中,但我不知道答案,所以就这样吧。
如果 Python 在运行时编译为字节码,是否只是初始编译步骤需要更长的时间?如果是这样的话,那岂不是代码中的一小部分前期成本(即,如果代码运行很长一段时间,C 和 python 之间的差异会减少吗?)
这不仅仅是 Python 代码被解释的事实导致它变慢,尽管这肯定限制了你的速度。
如果以字节码为中心的观点是正确的,那么要使 Python 代码与 C 一样快,您所要做的就是用对函数的直接调用替换解释器循环,消除任何字节码,并编译生成的代码。但事实并非如此。您也不必相信我的话:您可以自己测试一下。 Cython 将 Python 代码转换为 C,但转换然后编译的典型 Python 函数并没有显示出 C 级别的速度。您所要做的就是查看一些由此生成的典型 C 代码来了解原因。
真正的挑战是多重调度(或者无论正确的行话是什么——我不能把它全部说清楚),我的意思是这样一个事实:a+b
if a
and b
都知道是整数或浮点数可以在 C 中编译为一个操作,在 Python 中你必须做更多的事情来计算a+b
(获取名称绑定的对象,通过__add__
, etc.)
这就是为什么要使 Cython 达到 C 速度,您必须在关键路径中指定类型;这就是 Shedskin 如何使用(笛卡尔积)类型推断来加快 Python 代码的运行速度,从而从中提取出 C++ 代码;以及 PyPy 如何变得更快——JIT 可以关注代码的行为方式并专门研究类型等内容。每种方法都消除了动态性,无论是在编译时还是在运行时,以便它可以生成知道自己在做什么的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)