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

Python 为什么在Windows上导入某些SciPy模块需要这么长时间?,python,performance,scipy,Python,Performance,Scipy,在我的一些速度相对较快的Windows机器上,导入SciPy模块(如SciPy.signal)需要一秒钟的时间 和我不能简单地Ctrl C在中间看发生了什么,由于良好的老SimPy覆盖堆栈跟踪: forrtl: error (200): program aborting due to control-C event Image PC Routine Line Source KERNELBASE.dll

在我的一些速度相对较快的Windows机器上,导入SciPy模块(如SciPy.signal)需要一秒钟的时间

和我不能简单地Ctrl C在中间看发生了什么,由于良好的老SimPy覆盖堆栈跟踪:

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

不过,这并不是发生在我所有的机器上。发生了什么事?

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

我最终使用VisualStudio的调试器进入程序并查看它在做什么

事实证明,有两个正交因素促成了这一点:

出于我无法理解的原因,我在这里查看的一些scikits.odes包中有_init__uuy.py,它们有以下行:

__import__('pkg_resources').declare_namespace(__name__)
出于我无法理解的原因,一旦scikits.odes被导入,而SciPy出于某种奇怪的原因导入了scikits.odes,这一行就结束了运行,从您的安装中加载了数量惊人的软件包,其中大部分(如果不是全部的话)。安装越大,增长越慢

解决这个问题的办法是卸载这个有问题的包,或者如果你真的需要它,就注释掉这一行,或者做一些等效的事情,希望它不会被冒犯

您还没有将.py文件编译为.pyc运行python-mcileall。在Python安装目录中。这实际上对很多软件包都有帮助。起初我很怀疑


解决这两个问题将我的导入时间缩短到0.3秒左右,这似乎很正常。

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

我最终使用VisualStudio的调试器进入程序并查看它在做什么

事实证明,有两个正交因素促成了这一点:

出于我无法理解的原因,我在这里查看的一些scikits.odes包中有_init__uuy.py,它们有以下行:

__import__('pkg_resources').declare_namespace(__name__)
出于我无法理解的原因,一旦scikits.odes被导入,而SciPy出于某种奇怪的原因导入了scikits.odes,这一行就结束了运行,从您的安装中加载了数量惊人的软件包,其中大部分(如果不是全部的话)。安装越大,增长越慢

解决这个问题的办法是卸载这个有问题的包,或者如果你真的需要它,就注释掉这一行,或者做一些等效的事情,希望它不会被冒犯

您还没有将.py文件编译为.pyc运行python-mcileall。在Python安装目录中。这实际上对很多软件包都有帮助。起初我很怀疑


解决这两个问题将我的导入时间缩短到0.3秒左右,这似乎很正常。

一旦导入scikits.odes,SciPy就会这样做,因为一些奇怪的原因,你是说SciPy导入scikits.odes吗?听起来不对。@WarrenWeckesser:想想看。那个代码试图导入scikets.umfpack。这是否也会触发Scikets.odes的导入?@WarrenWeckesser:呃,我想我在源代码中找到了错误的一行。由于某种原因,它肯定在加载。不太清楚为什么。你有没有试过这个?我不太清楚scikits名称空间背后的历史。我知道早期将scikit实现为命名空间包的尝试导致了问题,这就是为什么像scikit learn和scikit image这样的项目最终放弃了scikit命名空间,并将其包名分别更改为sklearn和skimage。使用导入。。。您在回答中显示的内容是python实现名称空间包的一部分。听说了这些问题后,我学会了避免它们,并且从来没有研究过它们的实现细节。一旦scikits.odes被导入,SciPy会做什么?出于一些奇怪的原因,你是说SciPy会导入scikits.odes吗?听起来不对。@WarrenWeckesser:想想看。那个代码试图导入scikets.umfpack。这是否也会触发Scikets.odes的导入?@WarrenWeckesser:呃,我想我在源代码中找到了错误的一行。由于某种原因,它肯定在加载。不太清楚为什么。你有没有试过这个?我不太清楚scikits名称空间背后的历史。我知道早期将scikit实现为命名空间包的尝试导致了问题,这就是为什么像scikit learn和scikit image这样的项目最终放弃了scikit命名空间,并将其包名分别更改为sklearn和skimage。使用导入。。。您在回答中显示的内容是python实现名称空间包的一部分。在听说了这些问题之后,我学会了避免这些问题,并且从未研究过它们的实施细节。