Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“加速python”;进口;装载机_Python - Fatal编程技术网

“加速python”;进口;装载机

“加速python”;进口;装载机,python,Python,python的启动速度如此之慢让我感到非常沮丧。只导入更多或更少的基本模块需要一秒钟,因为python会沿着sys.path运行以查找匹配的文件(并为每个检查生成4个stat()调用-[“foo”、“foo.py”、“foo.pyc”、“foo.so”])。对于一个复杂的项目环境,有大量不同的目录,这可能需要大约5秒钟的时间——所有这些时间运行一个可能会立即失败的脚本 人们对如何加快这一过程有什么建议吗?例如,我见过的一种黑客行为是将LD\u PRELOAD\u 32环境变量设置为一个库,该库在

python的启动速度如此之慢让我感到非常沮丧。只导入更多或更少的基本模块需要一秒钟,因为python会沿着sys.path运行以查找匹配的文件(并为每个检查生成4个
stat()
调用-[“foo”、“foo.py”、“foo.pyc”、“foo.so”])。对于一个复杂的项目环境,有大量不同的目录,这可能需要大约5秒钟的时间——所有这些时间运行一个可能会立即失败的脚本


人们对如何加快这一过程有什么建议吗?例如,我见过的一种黑客行为是将
LD\u PRELOAD\u 32
环境变量设置为一个库,该库在运行之间缓存
enoint
调用的结果(例如失败的
stat()
调用)。当然,这有各种各样的问题(可能会混淆非python程序、负缓存等)。

首先想到的是:

  • 试着走小一点的路
  • 确保你的模块是pyc的,这样他们可以更快地加载
  • 确保不要重复导入,或导入太多
除此之外,您确定磁盘操作是让您陷入困境的原因吗?您的磁盘/操作系统真的很忙还是很旧很慢


也许碎片整理已经准备好了?

尽可能压缩尽可能多的
pyc
文件(为包提供适当的目录结构),并将该zipfile作为sys.path中的第一个条目(最好是在可用的最佳本地磁盘上),可以大大加快启动时间。

如果您没有选择,您可以创建一个用于存储python包的。ramdisk在文件系统中显示为目录,但实际上会直接映射到计算机的RAM。以下是Linux/Redhat的一些示例


注意:ramdisk是不稳定的,因此您还需要在常规硬盘上保存文件的备份,否则当计算机关闭时,您的数据会丢失。

您的前提中缺少一些东西--我从来没有见过一些“或多或少”的基本模块占用一秒钟来导入,我并不是在我所谓的尖端硬件上运行Python。要么您运行在一些非常旧的硬件上,要么您运行在一台超载的机器上,要么您的OS或Python安装在某种程度上被破坏。或者您不是真正导入“基本”模块


如果是前三个问题中的任何一个,您需要查看根本问题以寻求解决方案。如果是最后一个,我们真的需要知道具体的软件包有什么帮助。

当试图加快速度时,分析是关键。否则,您如何知道代码的哪些部分是真正慢的部分

不久前,我创建了运行时和导入概要可视化工具,我认为它在这里可能很有用。只需创建一个导入配置文件(使用Python 3.7+)并在其上运行tuna:

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

我不知道
导入一些模块是否比从一些模块导入一个函数、一些类、一些其他类等的
慢。但是你可以试试看。这里需要考虑的是:不是加载时间归因于从磁盘实际读取Python包,您是否考虑过某些模块在导入时可能会加载数据文件或运行一定量的计算?也就是说,任何.py文件都可以有运行的任意Python代码,而不是简单的声明,这可能是缓慢的原因。@MatrixFrog:这并不快,Python加载并计算整个模块,然后将指定的对象导入本地命名空间。不久前,我正在开发一些类似的功能。双重导入成本有限。sys.modules是已加载模块的缓存。@thouis-有限,但有时很重要。是的,我认为再次导入是单例样式嗯。。。根据经验,这不起作用。我尝试压缩我们站点包目录中的所有.py、.so和.pyc文件(无压缩),并将归档文件(在/tmp目录中)作为sys.path中的第一个元素;导入numpy和django实际上花费了1.25-2.00倍的时间。正如我建议的那样,
.so
文件没有帮助,
.py
文件实际上会损害您的性能(如果Python决定必须重新编译它们,它就无法保存已编译的表单)——试着只使用
.pyc
文件。啊哈,这确实加快了速度,但速度只有以前那么快:-(根据我的经验,这没有帮助,因为linux内核会主动缓存磁盘中的数据。linux中的虚拟内存非常好,(通常)ram中的缓冲区和文件中的缓冲区之间的唯一区别是文件有一个文件名并保持不变。