Skip to main content
 首页 » 编程设计

python之为什么在 Windows 上导入某些 SciPy 模块需要这么长时间

2025年05月04日19bonelee

在我的一些其他方面相对较快的 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 秒左右,这看起来很正常。