【问题标题】:Compiling Python Script for faster loading编译 Python 脚本以加快加载速度
【发布时间】:2020-05-06 01:11:22
【问题描述】:

我觉得我对此非常愚蠢。我知道我可以使用python -m compileall 将.py 文件编译为.pyc,其逻辑是脚本加载速度更快,因为它是预编译的,但如果它是主脚本,这似乎不是一个可用的功能。为了解释我的意思,假设我从命令行运行 test.py,如下所示:

python test.py

现在假设 test.py 是一个大文件,需要一些时间来转换为字节码,逻辑上要做的事情是预编译它,所以我在命令中运行以下命令:

python -m compileall test.py

然后我再次使用以下命令运行脚本:

python test.py

如果我理解正确,test.py 文件被重新编译,基本上使预编译毫无意义。我弄错了吗?如果我不是,有没有办法解决这个问题?

【问题讨论】:

  • 我相信这个帖子可能会回答你的问题:stackoverflow.com/questions/471191/why-compile-python-code
  • @RubenBrekelmans 我读过那个帖子。它触及了这个问题,但不清楚(至少对我来说不是)。
  • 冒着重复另一个线程的风险,但我理解的方式是,在您运行单个文件而没有额外导入的情况下,编译不会有任何区别。如果您在 test.py 中导入模块,那么编译会影响这些导入,但不会影响 test.py 本身。为什么要重新编译test.py,恐怕我不知道。

标签: python python-3.x compilation


【解决方案1】:

预编译在./__pycache__ 中生成一个.pyc 文件。通过运行以下命令,可以得到:

$ python3 -m compileall py.py
Compiling 'py.py'...
$ ls __pycache__
py.cpython-38.pyc
$ # It exists

为了测试运行脚本是否会重新编译所有内容,我将其删除。

$ rm -fr __pycache__
$ python3 py.py
Helloworld
$ ls __pycache__
ls: __pycache__: No such file or directory

如您所见,python script.py 不会重新编译脚本(它只是执行它。),与 python -m compileall script.py 不同。

如果我理解正确的话,test.py文件被重新编译,基本上使预编译毫无意义。

所以这不是毫无意义的。

【讨论】:

  • 谢谢!但这给我留下了一个问题,python 是否检查编译的文件,如果存在则使用它?例如。如果在运行文件之前没有删除编译后的版本,会不会一直使用编译后的版本?
  • 在运行python path/to/projectDir或导入模块(单个文件即可)时,它将使用pyc。但是在运行python path/to/projectDir/__main__.py 等单个文件时,它不会。 @user6916458
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2014-09-24
  • 2012-07-01
  • 2017-08-12
  • 2011-04-03
相关资源
最近更新 更多