为什么主要的可运行Python脚本不像模块一样编译成pyc文件?

11 浏览
0 Comments

为什么主要的可运行Python脚本不像模块一样编译成pyc文件?

我理解当你导入一个模块时,该文件会被编译成一个 .pyc 文件以提高速度。为什么主文件也不被编译成 .pyc 文件呢?这会减慢速度吗?是不是最好保持主文件尽可能小,或者这并不重要?

0
0 Comments

为什么主要可运行的Python脚本不像模块一样编译成pyc文件呢?

出现的原因:

- 编译主脚本会对位于例如`/usr/bin`中的脚本造成困扰。.pyc文件在相同目录中生成,从而污染了公共位置。

- 根据Python文档的参考,执行速度不是一个因素。它更多是提高加载时间的。

- 文档中提到“因此,通过将大部分代码移动到一个模块中并拥有一个小型的引导脚本来导入该模块,可以减少脚本的启动时间”,但除非你有一个大型脚本,否则这可能过度。

- 是的,这是真的,但仍然只是减少加载时间,从而导致减少启动时间。

解决方法:

- 将主要可运行的Python脚本尽可能简化,这样大部分代码可以被编译,提高加载时间。

- 将大部分代码移动到一个模块中,并编写一个小型的引导脚本来导入该模块,从而减少脚本的启动时间。

根据上述内容,我们可以得出结论:主要可运行的Python脚本不像模块一样编译成pyc文件的原因是为了避免污染公共位置,并且执行速度并不是一个重要因素。解决方法是简化主脚本并将大部分代码移到模块中,以减少加载和启动时间。

0
0 Comments

为什么主要的可运行的Python脚本没有像模块一样编译成pyc文件?

当一个模块被加载时,py文件会被“字节编译”成pyc文件。时间戳会记录在pyc文件中。

这样做的目的并不是为了让它运行得更快,而是为了加载得更快。

因此,在加载模块时进行“字节编译”是有意义的。

CPython将其源代码编译成“字节码”,为了性能原因,每当源文件发生更改时,它会将这个字节码缓存到文件系统中。

这使得加载Python模块的速度更快,因为可以跳过编译阶段。当源文件是foo.py时,CPython会将字节码缓存到与源文件相邻的foo.pyc文件中。

编译的字节码文件".pyc"中还插入了一个魔术数。每当Python更改字节码格式时,通常在主要版本发布时,这个魔术数就会改变。

这样可以确保以前版本的VM构建的pyc文件不会引起问题。时间戳用于确保pyc文件与用于创建它的py文件匹配。当魔术数或时间戳不匹配时,将重新编译py文件并写入新的pyc文件。

pyc文件在Python主要版本之间不兼容。当Python发现一个具有不匹配魔术数的pyc文件时,它会回退到重新编译源文件的较慢过程。这就是为什么如果简单地分发编译为相同平台的".pyc"文件,如果Python版本发生变化,将不再起作用的原因。

简而言之,如果存在一个字节编译的文件".pyc",并且其时间戳表明它是最近的,那么它将被加载,否则Python将回退到加载".py"文件的较慢方法。".py"文件的执行性能不受影响,但是".pyc"文件的加载比".py"文件快。

考虑执行a.py,它导入b.py

总体性能=加载时间(A.py)+执行时间(A.py)+加载时间(B.py)+执行时间(B.py)

由于加载时间(B.pyc)<加载时间(B.py)

通过使用字节编译的"pyc"文件,您应该会看到更好的性能。

另一个推断是模块比脚本或主文件更稳定。因此,它根本不会被编译成字节码。

参考资料:

- http://effbot.org/zone/python-compile.htm

- http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

0