为什么没有像现代Javascript实现那样对Python进行优化?


11

V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。

Python为什么没有这些?

我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编​​写的Python实现会比C语言中的参考实现更快。IronPython,同样的想法,但我看不到.NET Framework如何提高速度。


2
像其他任何.NET语言一样,IronPython被编译为Microsoft的“通用中间语言”,针对该语言存在非常成熟的JIT编译器实现。
布朗

2
编程语言是一种规范(写在某些文档中),而不是软件。仅编程语言实现是软件(并且可以是编译器或解释器)。
Basile Starynkevitch

1
@BasileStarynkevitch:我不明白你要用这句话告诉我们什么。该OP明确询问CPython的,PyPy和IronPython,这特定的Python实现。
布朗

1
考虑到问题的最后一段,@ DocBrown似乎像一个需要提出的要点,当它专门将Python称为解释语言时,这显示出一种误解。
8bittree

Answers:


19

Python为什么没有这些?

我不确定为什么您会认为没有Python实现会在意性能。PyPyIronPythonJython都是工业级的,可用于生产的Python实现,它们都在乎性能。Pyston专门为提高性能而开发的开发实现。Unladen SwallowPsyco也是提高Python性能的项目。

但是,事实是CPython用户大大超过了所有其他其他实现的用户群,但社区却拒绝了Unladen Swallow,这些项目中的大多数要么已死,要么正在竭力吸引开发人员,这应该告诉您一些有关Python如何使用Python的信息。社区重视绩效。

这个答案很好地说明了Python社区的典型心态:与其解决性能问题,不如说他们不愿意使用Python编写代码。

我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编​​写的Python实现会比C中的参考实现更快。

第一关:这并不重要语言编译器是写在所有后,编译器只执行。一次,所以即使它是缓慢的,这并不重要:编译器的性能是不相关的,什么是相关是编译器输出的性能。

其次,由于只考虑编译器的输出速度有多快,并且编译器是用Python编写的,即它所编译的语言,因此它实际上可以通过编译自身来提高自身的速度。

第三,没有所谓的“解释语言”。语言是一组数学规则和限制。这是一个规范。张纸。语言不会被编译或解释。一种语言就是。编译和解释是语言实现的特征,更准确地说,不是语言,而是编译器或解释器(duh!)。每种语言都可以由编译器实现。每种语言都可以由口译员实施。您可以从解释器机械地生成编译器,也可以从编译器机械地生成解释器。

但是所有这些实际上并不重要,因为PyPy实际上不是用Python编写的。它是用RPython编写的。RPython由两部分组成,RPython编程语言和RPython框架。

RPython编程语言不是 Python。这是另一种编程语言。RPython是一种静态类型的编程语言,在抽象上与Java大致处于同一级别,并且具有与C大致相同的性能。RPython是Python的语法和语义子集,这意味着每个RPython程序都是有效的Python程序,并且可以由Python实现运行(尽管通常要慢几个数量级,但这仍然对调试很有用,因为您可以访问所有Python工具,并且解释会立即开始,而编译语言实现通常大约需要5-10分钟),但事实并非如此。

RPython框架是用于以RPython编程语言编写高性能动态语言实现的框架。它包括垃圾收集器,对象空间,元对象协议,预定义的对象,类型和操作等。但是最重​​要的是它能够从解释器自动生成JIT编译器:如果您在RPython框架中实现一种语言,则只需要编写解释器,RPython框架就可以处理JIT。

RPython平台上有很多语言实现,而不仅仅是PyPy。

IronPython,相同的想法,但我不知道.NET Framework如何提高速度。

ISO CLI的大多数实现,例如Microsoft或Mono的各种.NET变体,都包含复杂的垃圾收集器,优化器和编译器。Jython和Java实现也是如此。

IronPython是一个编译器,它将Python源代码编译为DLR树(DLR是动态语言运行时),然后将其进一步编译为CIL字节代码,然后通常再次将其进一步编译为本机代码。


6

V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。

Python为什么没有这些?

JavaScript包含在Web浏览器中,并且当今有大量软件旨在在Web浏览器中运行。这使得JavaScript性能非常重要,这使得诸如Google,Apple和Microsoft之类的公司投入了大量资源来提高JavaScript运行时的速度。如果将这笔资金重定向到Python,那将同样快。

PyPy我不明白用Python(一种解释性语言)编​​写的Python实现会比C中的参考实现更快。

想法是,一旦对代码进行JIT编辑,就不再“解释”。PyPI通过将Python代码转换为机器代码(例如x86_64机器代码)来工作,然后直接在处理器上执行。


3
尤其相关的是,在Web浏览器中,没有JavaScript可以替代(或者至少在所有主要浏览器上都没有)。如果要在Web浏览器中实现快速性能,则必须具有快速的JavaScript实现。在运行Python的平台上,几乎可以肯定的是,您可以转移到另一种可能执行效果更好的语言。
8bittree '17

-3

如果您将python代码结构化为带有简单顶级启动程序作为主要python文件的模块(其中包含很少的代码),则python将所有其余代码编译为与机器无关的字节码,这些就是您在目录结构中看到的.pyc文件。这样可以最大程度减少首次运行后的加载和解释时间。

如果使用-O或-OO标志启动脚本或将PYTHONOPTIMIZE设置为大于0的值,则会生成.pyo文件,并对其进行进一步优化。

如果您需要对某些特定功能进行高度优化,则可以用C,C ++,FORTRAN或GO编写它们,然后在python中使用它们。


您如何将非C扩展集成到Python中?我只知道Cython的C扩展名。

1
@Bey:基本上,只要您知道函数签名,共享库(.dll或.so)中的任何内容(.dll或.so)都可以从python调用-这些签名可以手动配置,通过swing等工具生成,甚至从doxygen文档生成。stackoverflow.com/questions/5811949/…很有帮助,blog.heroku.com / see_python_see_python_go_go_python_go
Steve Barnes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.