【发布时间】:2019-04-26 05:01:19
【问题描述】:
我试图弄清楚 Python 3(使用 CPython 作为解释器)是如何执行其程序的。我发现步骤是:
由 CPython 编译器将 Python 源代码(.py 文件)编译为 Python 字节码 (.pyc) 文件。在导入任何模块的情况下,会保存 .pyc 文件,在运行一个 main.py Python 脚本的情况下,它们不会被保存。
Python 虚拟机将字节码解释为特定于硬件的机器码。
在这里找到的一个很好的答案 https://stackoverflow.com/a/1732383/8640077 说,与 JVM 相比,Python 虚拟机运行其字节码需要更长的时间,因为 Java 字节码包含有关数据类型的信息,而 Python 虚拟机会逐行解释,并且必须确定数据类型。
我的问题是 Python 虚拟机如何确定数据类型,它是在解释机器代码期间还是在单独的过程(例如,会产生另一个中间代码)期间发生的?
【问题讨论】:
-
为什么你认为 Python 需要“确定数据类型”? Python 是一种动态类型语言;只有在您特别询问时才会检查类型,并且可以在变量的整个生命周期内非常持续地进行检查。我非常怀疑 Python 和 Java 之间的执行时间差异是由于运行时类型检查造成的。
-
所以即使在从字节码到机器码的翻译过程中,Python 也不知道变量的类型? AD 2:那么 Python 和 Java 在执行时间上的最大差异是什么?
-
不行,怎么可能?程序本身可以随时改变变量的类型,这就是动态类型的意思。此代码完全合法:
a = 'mystring'; a = MyClassThatIsNotAString()。a的类型是什么? -
我在寻找您问题的答案时找到了this resource。也许你会发现它很有用。
-
this article我还没有完全看懂,但它要短得多,我想它回答了你的问题。
标签: python python-3.x virtual-machine cpython