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