加速Python“导入”加载器

25 投票
5 回答
15157 浏览
提问于 2025-04-15 17:40

我真的对Python启动速度慢感到非常沮丧。就连导入一些基本的模块都要花上一秒钟,因为Python要在系统路径(sys.path)里查找匹配的文件(每次检查还要生成4个stat()调用 - ["foo", "foo.py", "foo.pyc", "foo.so"])。对于一个复杂的项目环境,里面有很多不同的目录,这个过程可能要花大约5秒钟——而这只是为了运行一个可能立刻就会失败的脚本。

大家有没有什么建议可以加快这个过程?比如,我看到过一个小技巧,就是把LD_PRELOAD_32这个环境变量设置为一个可以缓存ENOENT调用结果的库(比如,缓存失败的stat()调用)。当然,这样做会带来各种问题(可能会让非Python程序感到困惑,负缓存等等)。

5 个回答

4

在想要加快程序运行速度的时候,了解代码的性能是非常重要的。否则,你怎么知道代码中哪些部分真的很慢呢?

之前我创建了一个叫做 tuna 的工具,用来查看程序运行和导入的性能,我觉得这个工具在这里可能会很有用。你只需要创建一个导入性能报告(使用 Python 3.7 及以上版本),然后用 tuna 来运行它:

python3.7 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log

enter image description here

5

首先想到的几点是:

  • 试试用更短的路径
  • 确保你的模块是pyc格式,这样加载会更快
  • 确保你没有重复导入,或者导入太多东西

除此之外,你确定是磁盘操作让你变慢吗?你的磁盘或者操作系统真的很忙,或者老旧而慢吗?

也许需要进行一次碎片整理?

11

把尽可能多的 pyc 文件打包成一个压缩文件,并保持好包的目录结构,然后把这个压缩文件放在系统路径(sys.path)的最前面(最好放在本地磁盘上),这样可以大大加快程序启动的速度。

撰写回答