在我的一些其他方面相对较快的 Windows 机器上,导入像 scipy.signal
这样的 SciPy 模块需要非常长的时间(超过一秒)。
而且我不能简单地在中间使用 Ctrl-C 来查看发生了什么,这要感谢旧的 SciPy 覆盖了堆栈跟踪:
forrtl: error (200): program aborting due to control-C event
Image PC Routine Line Source
KERNELBASE.dll 00007FFBD9AFD37F Unknown Unknown Unknown
KERNEL32.DLL 00007FFBDBE213D2 Unknown Unknown Unknown
ntdll.dll 00007FFBDC8C54E4 Unknown Unknown Unknown
不过,这并没有发生在我所有的机器上。怎么回事?
最佳答案
这对我来说是一个非常令人沮丧的问题,所以我在这里发布了解决方案。
我最终使用 Visual Studio 的调试器进入程序并查看它在做什么。
事实证明,有 2 个正交因素促成了这一点:
出于我无法理解的原因,一些包(我在这里查看
scikits.odes
)有__init__.py
这一行:__import__('pkg_resources').declare_namespace(__name__)
出于我无法理解的原因,一旦导入了
scikits.odes
(SciPy 出于某种奇怪的原因这样做),该行将结束运行,从您的安装中加载大量的包(看起来,大多数(如果不是全部))。安装越大,速度越慢。这个问题的解决方案是卸载这个有问题的包,或者如果你真的需要它,注释掉这一行(或做一些等效的事情)并希望它不会被冒犯。
您还没有将您的
.py
文件编译为.pyc
(在您的 Python 安装中运行python -m compileall .
目录)。这实际上对很多包都有帮助。 (起初我持怀疑态度。)
解决这两个问题后,我的导入时间减少到 0.3 秒左右,这看起来很正常。
关于python - 为什么在 Windows 上导入某些 SciPy 模块需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43246944/