我对python启动速度有多慢感到非常沮丧。只需导入更多或更少的基本模块需要一秒钟,因为python沿着sys.path运行,寻找匹配的文件(并生成4个stat()
调用 - [“foo”,“foo.py”,“foo.pyc” ,“foo.so”] - 每次检查)。对于一个复杂的项目环境,有大量不同的目录,这可能需要大约5秒钟 - 所有这些都可以运行一个可能立即失败的脚本。
有人建议如何加快这个过程吗?例如,我见过的一个hack是将LD_PRELOAD_32
环境变量设置为一个库,该库在运行之间缓存ENOENT
调用的结果(例如,失败的stat()
调用)。当然,这有各种各样的问题(可能会混淆非python程序,负面缓存等)。
答案 0 :(得分:10)
尽可能多地填充pyc
个文件(使用适当的软件包目录结构),并将该zipfile作为sys.path中的第一个条目(理想情况下位于最佳可用本地磁盘上)可以加速启动次数很多。
答案 1 :(得分:4)
首先想到的是:
除此之外,你确定磁盘操作会让你陷入困境吗?你的磁盘/操作系统真的很忙还是老而慢?
也许碎片整理有序?
答案 2 :(得分:2)
如果你的选项用完了,你可以创建一个ramdisk来存储你的python包。 ramdisk在文件系统中显示为目录,但实际上会直接映射到计算机的RAM。以下是Linux / Redhat的一些instructions。
注意:ramdisk是易失性的,因此您还需要在常规硬盘上备份文件,否则当计算机关闭时您将丢失数据。
答案 3 :(得分:1)
你的前提中缺少一些东西 - 我从来没有看到一些“或多或少”的基本模块需要花费一秒钟来导入,而我并没有在我称之为尖端硬件上运行Python。要么是在一些严重旧的硬件上运行,要么是在超载的机器上运行,要么在某种程度上破坏了操作系统或Python安装。或者你并没有真正导入“基本”模块。
如果是前三个问题中的任何一个,您需要查看解决方案的根本问题。如果它是最后一个,我们真的需要知道具体的包是什么帮助。
答案 4 :(得分:0)
在尝试加快速度时,分析是关键。否则,您如何知道代码的哪些部分实际上是最慢的部分?
前一段时间,我已经创建了运行时和导入配置文件可视化工具tuna,我认为在这里可能有用。只需创建一个导入配置文件(使用Python 3.7+)并在其上运行金枪鱼:
python3.7 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log