V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。
Python为什么没有这些?
我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编写的Python实现会比C语言中的参考实现更快。IronPython,同样的想法,但我看不到.NET Framework如何提高速度。
V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。
Python为什么没有这些?
我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编写的Python实现会比C语言中的参考实现更快。IronPython,同样的想法,但我看不到.NET Framework如何提高速度。
Answers:
Python为什么没有这些?
我不确定为什么您会认为没有Python实现会在意性能。PyPy,IronPython和Jython都是工业级的,可用于生产的Python实现,它们都在乎性能。Pyston是专门为提高性能而开发的开发实现。Unladen Swallow和Psyco也是提高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字节代码,然后通常再次将其进一步编译为本机代码。
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机器代码)来工作,然后直接在处理器上执行。
如果您将python代码结构化为带有简单顶级启动程序作为主要python文件的模块(其中包含很少的代码),则python将所有其余代码编译为与机器无关的字节码,这些就是您在目录结构中看到的.pyc文件。这样可以最大程度减少首次运行后的加载和解释时间。
如果使用-O或-OO标志启动脚本或将PYTHONOPTIMIZE设置为大于0的值,则会生成.pyo文件,并对其进行进一步优化。
如果您需要对某些特定功能进行高度优化,则可以用C,C ++,FORTRAN或GO编写它们,然后在python中使用它们。