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

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)

但是,这并不是在我的所有机器上都会发生.这是怎么回事?

Meh*_*dad 6

这对我来说是一个非常令人沮丧的问题,所以我在这里发布解决方案.

我最终使用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秒左右,这看起来很正常.