在我的一些相对较快的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
但是,这并不是在我的所有机器上都会发生。发生了什么事?
答案 0 :(得分:6)
这对我来说是一个非常令人沮丧的问题,所以我在这里发布解决方案。
我最终使用Visual Studio的调试器进入程序并查看它正在做什么。
事实证明,有两个正交因素促成了这一点:
由于我无法理解的原因,一些软件包(我在这里看scikits.odes
)有__init__.py
个有此行:
__import__('pkg_resources').declare_namespace(__name__)
由于我无法理解的原因,一旦scikits.odes
被导入(SciPy出于某些奇怪的原因),此行最终会运行,从您的安装中加载一些不合适的软件包(看起来,大多数(如果不是全部的话)他们)。安装越大,速度越慢。
解决这个问题的方法是卸载这个有问题的软件包,或者如果你真的需要它,可以注释掉这一行(或者做一些相同的事情)并希望它不会被冒犯。
您尚未将.py
文件编译为.pyc
(在Python安装目录中运行python -m compileall .
)。这个实际上有助于很多软件包。 (起初我对此持怀疑态度。)
修复这两个问题会将导入时间缩短到0.3秒左右,这似乎是正常的。