【发布时间】:2013-05-04 10:54:53
【问题描述】:
如何加快导入 Python 模块的问题之前已经提出过(Speeding up the python "import" loader 和 Python -- Speed Up Imports?),但没有具体示例,也没有产生公认的解决方案。因此,我将在这里再次讨论这个问题,但这次是一个具体的例子。
我有一个 Python 脚本,它从磁盘加载 3-D 图像堆栈,对其进行平滑处理,并将其显示为电影。当我想快速查看我的数据时,我会从系统命令提示符调用此脚本。我对平滑数据所需的 700 毫秒感到满意,因为这与 MATLAB 相当。但是,导入模块需要额外的 650 毫秒。所以从用户的角度来看,Python 代码的运行速度只有一半。
这是我要导入的一系列模块:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import scipy.ndimage
import scipy.signal
import sys
import os
当然,并非所有模块的导入速度都一样慢。罪魁祸首是:
matplotlib.pyplot [300ms]
numpy [110ms]
scipy.signal [200ms]
我已经尝试过使用from,但这并没有更快。由于 Matplotlib 是罪魁祸首,而且它以缓慢的屏幕更新而闻名,因此我寻找了替代方案。一种是 PyQtGraph,但导入需要 550 毫秒。
我知道一个明显的解决方案,即从交互式 Python 会话而不是系统命令提示符调用我的函数。这很好,但它太像 MATLAB,我更喜欢从系统提示符中获得我的函数的优雅。
我是 Python 新手,目前不知道如何继续。由于我是新手,我很感激有关如何实施提议的解决方案的链接。理想情况下,我正在寻找一个简单的解决方案(不是我们所有人!),因为代码需要在多台 Mac 和 Linux 机器之间移植。
【问题讨论】:
-
检查它是否正在生成 Python 模块的 .pyc 版本 - 加载这些版本要快一些。但即使有 pyc 文件,这些数字也是相当合理的。
-
另外,如果
sys.path上有很多 .egg 目录,它会在每个目录中查找模块,这会减慢速度。使用分发包管理器或 pip 以更好的布局安装它们。不过,您不太可能获得大幅提速。 -
我在较早的问题中注意到了 pyc 建议,但我不知道在哪里可以找到模块的 pyc 版本。现在我在 Mac 上。
-
如果您使用的是 3.2 或更高版本,请在模块中查找
__pycache__目录(即.../site-packages/matplotlib/__pycache__)。对于旧版本,.pyc文件紧挨着.py文件。它们通常是自动创建的,但在某些情况下 Python 没有存储模块的写入权限。 -
也许获得显着加速的唯一方法是将模块缓存在内存中 - 使用 ramdisk 或使用正在运行的 Python 进程,您只需发出信号以重做计算。
标签: python performance import module