【问题标题】:Should python imports take this long?python导入需要这么长时间吗?
【发布时间】:2015-08-24 02:54:12
【问题描述】:

对于以下命令

%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

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

【问题讨论】:

  • 请注意,从 Python 3.7 开始,您可以使用“-X importtime”选项来测量每次导入的时间docs.python.org/3/using/…

标签: python time import


【解决方案1】:

有些模块会在您使用它们时进行初始化,而其他模块会在您启动时初始化所有内容。 Matplotlib 就是这些模块之一。

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

所以,在回答你的问题时,是的。

如果您想为您的问题找到一个“解决方案”,您可能希望仅在您打算使用 matplotlib 时导入它,或者在程序开始时有一个加载屏幕 /print

【讨论】:

  • 这很有帮助。为了快速调试,有没有办法初始化一次,这样再次运行就不需要了?
  • 不是真的,除非你想保持一个运行的模块一致。如果你愿意,你可以导入子模块而不是整个模块。这当然只有在模块在启动时初始化所有内容时才有效。
  • 我想一种方法是制作一个单独的脚本,作为导入 matplot lib 的快速而肮脏的命令提示符,然后在您按 Enter 时运行一个脚本......但即便如此,我不确定你要调试的脚本是否会检测到添加的模块...
  • 值得一提的是,Jupyter Notebooks 的目的是在调试代码时无需重新导入模块。您只需要执行一次导入单元格,任何后续有错误的单元格都可以重新运行,而无需重新导入模块。
【解决方案2】:

为什么导入会很慢

导入语句在导入时执行模块代码。如果这只是类/函数定义,通常会非常快;一些包/模块在启动时运行昂贵的代码。这是一个简短的例子:

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,它可以检测代码更改并在下次调用时自动重新加载它们。如果它不能开箱即用,可以手动配置。在上面的示例中,自动重载将具有如下行为:


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.

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2011-08-27
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多