python 导入需要这么长时间吗?

Should python imports take this long?

对于以下命令

%time python test.py

在此脚本中,test.py

import numpy as np
from math import * 
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import LogNorm
from scipy import stats

我得到输出:

real    0m1.933s
user    0m1.322s
sys     0m0.282s

有什么问题吗?或者这是导入需要多长时间?

一些模块在您使用时进行初始化,而另一些模块在您启动时进行初始化。 Matplotlib 是这些模块之一。

由于 matplotlib 是一个包含大量功能的庞大软件包,所以我对它花费这么长时间并不感到惊讶,尽管它可能会让人讨厌。

因此,在回答您的问题时,对某些人是肯定的。

如果你想要 "solution" 解决你的问题,你可能只想在你要使用它时导入 matplotlib,或者在你的开始时有一个加载屏幕/print程序。

为什么导入会很慢

导入语句在导入时执行模块代码。如果这只是 class/function 个定义,它通常很快;一些 packages/modules 运行 昂贵的启动代码。这是一个简短的例子:

my_module1.py:

def func1():
    print("ran func1")

my_module2.py:

import time

def import_func():
    print("running some import-time code...")
    time.sleep(1)
    print("import startup complete")

# expensive code that executes on import
import_func()

def func2():
    print("ran func2")

处理缓慢的导入

如果您经常 运行 缓慢的导入可能会很麻烦,例如经常重新 运行 脚本以更新更改(最初提出问题的原因)。值得庆幸的是,ipython 现在有 autoreload 可以检测代码更改并在下次调用时自动重新加载它们。如果它不能开箱即用,可以手动配置。在上面的示例中,autoreload 将具有如下行为:


import my_module1

my_module1.func1()
# prints: "ran func1"

# update func1 on-file as follows: 
# def func1():
#    print("ran modified func1")

my_module1.func1()

# prints: "ran modified func1" if autoreload is correctly configured.