有没有办法找出哪些导入在Python中花费的时间最长?看一看python -m cProfile <script>的输出,它似乎不包括import语句(可以理解,考虑到潜在的巨大依赖树)。最初我认为是这样的,因为我看到了__import__()调用的一行,但我认为这实际上可能是因为某个地方的代码显式地调用了它,只有import语句的玩具程序没有它的一行。
现在我只是在使用:
start = time.time()
import <module>
print '%s / time: %f' % (<module>, time.time()-start)在每个模块周围,但它不会递归地分析它,以查看导入中的哪个导入可能会导致时间膨胀。
发布于 2019-04-10 09:26:37
这是一个完全合法的问题。例如,尝试加速CLI应用程序的冷启动是有意义的。Python3.7现在提供了打印导入时间的选项:https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPROFILEIMPORTTIME
您可以运行以下命令:
python -X importtime myscript.py或者:
PYTHONPROFILEIMPORTTIME=1 myscript.py编辑:要查看这些结果,我推荐使用tuna。
发布于 2016-03-10 23:11:09
正如danielu13的评论中所述,您真正想要分析的是在导入此模块时在模块内执行的代码。
似乎cProfile在其输出中包含了在导入时执行的代码。它显示为模块级代码的<module>。许多包都是作为__init__.py文件导入的,因此gprof2dot会显示__init__:23:<module> (行号可能不同),它不会告诉您文件来自哪个包。
使用cprofilev,您可以找出哪些文件(以及软件包)占用的时间最多。
附带说明:分析导入实际上在某些情况下是有意义的。在我的系统上,导入模块networkx (https://networkx.github.io/)需要1.7秒。
发布于 2019-08-08 16:06:11
Python2.7的一个非常简单且没有层次结构的解决方案,它打印模块名称和自上一个模块以来的导入时间:
LAST_TIME = time.time()
class ImportHook(object):
def find_module(self, fullname, path=None):
global LAST_TIME
cur_time = time.time()
delta = cur_time - LAST_TIME
long_time = '!!!!!!!!!!!!!!\n' * 10 if delta > 0.05 else ''
print '%0.3f %s \n %s' % (delta, long_time, fullname),
LAST_TIME = cur_time
import sys
sys.meta_path.insert(0, ImportHook())https://stackoverflow.com/questions/34755728
复制相似问题