当前位置: 首页 > 面试题库 >

Python 3解释器是否具有JIT功能?

孔皓
2023-03-14
问题内容

我发现,当我向Python提出更多要求时,python并未100%使用我的机器资源,而且速度不是很快,与许多其他解释型语言相比,它很快,但是与编译语言相比,我认为区别是真的很棒。

是否可以使用Python 3中的即时(JIT)编译器来加快处理速度?

通常,只有JIT编译器才能提高解释语言的性能,所以我指的是这种方法,如果有其他解决方案可用,我希望接受新的答案。


问题答案:

首先,Python
3(.x)是一种语言,它可以有许多实现。好的,到目前为止,除CPython之外,没有其他实现实际实现这些语言的版本。但这将改变(PyPy正在追赶)。

要回答您要问的问题:CPython(3.x或其他版本)不包含,也从未包含并且可能永远不会包含JIT编译器。其他一些Python实现(本机为PyPy,Jython和IronPython,通过在其构建的虚拟机上重新使用JIT编译器)确实具有JIT编译器。而且,当他们添加Python
3支持时,他们的JIT编译器没有理由停止工作。

但是当我在这里时,也让我解决一个误解:

通常,只有JIT编译器才能提高解释语言的性能

这是不正确的。JIT编译器以其最基本的形式,仅消除了解释器开销,这可以解决您看到的某些速度下降,但不能解决大多数问题。一个 好的
JIT编译器还执行了许多优化,这些优化通常消除了实现众多Python功能所需的开销(通过检测允许更有效实现的特殊情况),其中突出的例子是动态类型,多态性和各种自省特性。

仅仅实现 一个
编译器不会与帮助。您需要非常巧妙的优化,其中大多数仅在非常特定的情况下并且在有限的时间范围内有效。JIT编译器在这里很容易,因为它们可以在运行时生成专用代码(这是它们的重点),可以通过在运行时观察程序来更轻松(更准确)地分析程序,并且可以在无效时撤消优化。与提前编译器不同,它们还可以与解释器进行交互,并且经常这样做是因为这是明智的设计决策。我想这就是为什么他们与人们心目中的口译员联系在一起的原因,尽管他们可以而且确实独立存在。

除了优化解释器的代码本身之外,还有其他一些方法可以使Python的实现更快,例如HotPy(2)项目。但是,这些代码目前处于研究或实验阶段,还没有显示它们在实际代码中的有效性(和成熟度)。

当然,特定程序的性能对程序本身的依赖远不止于语言实现。语言实现只为您执行一系列操作的速度设置了上限。通常,您可以通过避免不必要的工作(即通过优化程序)来更好地提高程序的性能。不管您是通过解释器,JIT编译器还是提前编译器运行程序,这都是正确的。如果您想让某些事情变得更快,那么请不要全力以赴以获得更快的语言实现。有些应用程序在解释和动态性方面是不可行的,但它们并不像您想像的那样普遍(通常,通过有选择地调用由机器代码编译的代码来解决)。



 类似资料:
  • Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中。 安装完成后,我们可以将路径 /usr/local/python3/bin 添加到您的 Linux/Unix 操作系统的环境变量中,这样您就可以通过 shell 终端输入下面的命令来启动 Python3 。 $ PATH=$PATH:/us

  • 问题内容: SASS具有一个称为的功能,该功能允许选择器继承另一个选择器的属性,但不复制属性(如mixins)。 LESS是否也具有此功能? 问题答案: 是的,Less.js推出的V1.4.0。 LESS没有实现SASS和Stylus使用的at- rule()语法,而是实现了伪类语法,这为LESS的实现提供了灵活性,使其可以直接应用于选择器本身或在语句内部。因此,这两个都将起作用: 要么 此外,您

  • 问题内容: 目前,我正在开发中使用mysql 5.7,在生产中使用5.6。每次我在开发中使用group by运行查询时,都会收到类似“错误代码:1055。SELECT列表的表达式#1不在GROUP BY中”的错误。 这是查询。 为了解决这个问题,我使用5.7 ANY_VALUE中的mysql函数,但是主要问题是它在mysql 5.6中不可用 因此,如果我修复开发的sql语句,我将在生产中出现错误。

  • 请注意,我的问题是关于JVM解释器,而不是JIT编译器。JIT编译器将java字节码转换为本机代码。因此,这必须意味着JVM中的解释器不会将字节码转换为机器码。因此,问题是:从本质上讲,口译员做什么?如果有人能帮我用一个简单的字节码示例来回答这个问题,相当于1 1=2,即解释器在执行这个加法操作时做了什么?(我的隐含问题是,如果解释器不翻译为机器代码,那么哪个CPU执行添加操作,那么该操作是如何执

  • 问题内容: 在Swift中,转义的闭包参数用注释。在Objective- C中是否有任何等效项,以便将生成的Swift接口标记为? 问题答案: 是的,但是从您在问题中提出的建议来看是落后的。规则是,除非明确标记,否则Objective-C不可为空的块会 自动 转换为Swift作为函数。 __

  • 根据我的理解,如果Java解释器单独开始逐行执行字节码,那么性能将很慢,因此JIT将出现在代码优化中,以加快代码的执行。 JIT编译器优化代码,java解释器逐行翻译优化的代码。由于JIT只在运行时运行,所以我们不会得到任何二进制输出。一旦解释器翻译,就会产生二进制代码。 ---现在我的问题是,JIT和JAVA解释器一起工作吗?或者,jit编译器首先工作,然后java解释器开始工作? 请确认这一点

  • 问题内容: 我正在学习Java,以下内容对我来说有些混乱。我了解的是: Java编译器 →Java编译器仅将程序转换为文件,这意味着将我们的源代码转换为字节码(这是使Java平台独立的虚拟机(JVM)的操作码的列表)。 Java Interpreter →仅“解释”代码,而 没有 将其转换为本地机器代码。它将一条字节码的每条指令作为一条命令一一执行并执行,而不管同一条指令出现多少次。这就是为什么它

  • 我正在学习Java,下面的事情让我有点困惑。我的理解是: > Java编译器→Java编译器只是将程序转换为文件,这意味着将我们的源代码转换为字节码(它是虚拟机(JVM)的操作代码列表,使Java平台独立)。 Java解释器→只是“解释”代码,而不是将其转换为本机机器代码。它将字节码的每一条指令作为命令逐一执行并执行,而不管同一条指令发生多少次。这就是为什么它很慢,Java引入了JIT概念。 JI