导入 tflearn 很慢

Importing tflearn is very slow

与其他模块相比,导入 tflearn 需要花费大量时间。

在新创建的虚拟环境中,只安装了 tflearn 和最小的依赖项 pip:

按照建议安装 h5py 和 scipy 后,import tflearn 消耗的时间高达 ~3.5 秒。我怎样才能减少导入时间?

(以上所有测试都是在test.py和运行time python test.py中多次放入语句完成的。报告时间为[报告的"real"时间time 内置于 bash.)

简答

在 Jupyter 或其他具有长期解释器会话的工具中完成初始工作,因此您无需等待那么多时间来导入。

长答案

您可以使用 python -v 来跟踪导入。我在一个原始的 python:3.6-stretch Docker 容器中从 apt 安装 moreutils,从 pip 安装 tensorflowtflearn...

root@10e4bcd91377:/# python -v -c 'import tensorflow' 2>&1 | ts '%H:%M:%.S' | grep 'import ' | wc -l
954
root@10e4bcd91377:/# python -v -c 'import tflearn' 2>&1 | ts '%H:%M:%.S' | grep 'import ' | wc -l
1768

很明显,导入 tflearn 会导入大量包。 哪些?

# python -v -c 'import tflearn' 2>&1 | grep 'import ' | cut -f1 -d# | sort | uniq > tflearn-imports.txt
# python -v -c 'import tensorflow' 2>&1 | grep 'import ' | cut -f1 -d# | sort | uniq > tensorflow-imports.txt
# diff --suppress-common-lines tensorflow-imports.txt tflearn-imports.txt

我将保留 831 行输出,但看起来 tflearn 导入了所有 tensorflow.contrib,这需要相当长的时间,而且它不是导入 tensorflow本身就是。有了这些信息,我们可以查看原始的 python -v -c 'import tflearn' 2>&1 输出——看起来 tflearn.variables 是导入 tensorflow.contrib...

的模块
# <snip>
import 'tensorflow.contrib.summary.summary'
import 'tensorflow.contrib'
import 'tflearn.variables'
import 'tflearn.config'
# <snip>

难道是this from tensorflow.contrib.framework.python.ops import add_arg_scope as contrib_add_arg_scope statement?让我们找出...

# time python -v -c 'from tensorflow.contrib.framework.python.ops import add_arg_scope as contrib_add_arg_scope' 2>&1 | grep 'import ' | wc -l
1727

real    0m4.010s
user    0m3.820s
sys 0m0.410s
root@10e4bcd91377:/#

嗯,看起来像!由于 Python 的导入工作方式,导入子模块必须评估整个包,并且由于 tensorflow.contrib 不使用 Tensorflow's Python lazy loader (which does mention contrib),因此需要一段时间。

(这里的模块中曾经讨论过vendoring,但那是无关紧要的,因为:)

不幸的是,tflearn 中的其他地方也从 contrib 中导入了点点滴滴,因此消除这种依赖性不会有太大帮助。

一些导入的模块会在您开始使用它们时进行初始化,而有些则不会。 tflearn 在您导入它时进行初始化,并且由于它有很多依赖项,因此花费那么多时间也就不足为奇了。

下面的 SO QA 会给你这么长时间的优化思路。

improving speed of Python module import

祝你好运