为什么在Windows上导入一些SciPy模块需要这么长时间?

时间:2017-04-06 06:05:27

标签: python performance scipy

在我的一些相对较快的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
但是,这并不是在我的所有机器上都会发生。发生了什么事?

1 个答案:

答案 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秒左右,这似乎是正常的。