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.
对于以下命令
%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.