【发布时间】:2015-10-08 00:53:12
【问题描述】:
我使用 cProfile 分析了我的代码以查找瓶颈,我发现了一个特殊的瓶颈。
我的代码结构如下:
def A1Distance(a_list):
#returns something
pr = cProfile.Profile()
pr.enable()
x = A1Distance(list_comprehension)
pr.disable()
cProfile 总共运行了 17.554 秒。就总时间而言,最重要的函数是:
ncalls tottime percall cumtime percall filename:lineno(function)
1 9.884 9.884 17.554 17.554 Cov_Opt_Parallel.py:141(A1Distance)
如您所见,A1Distance 大约需要 10 秒并被调用一次。如果我将 pr.enable() 和 pr.disable() 放在函数内部,则输出相同,但 A1Distance 没有 10 秒。因此,仅调用一个函数似乎需要 10 秒。有什么建议可以解决这个问题吗?
【问题讨论】:
-
A1Distance是递归函数吗? -
您作为参数提供的列表理解执行起来成本高吗?它在函数外部生成,然后传入,因此在函数内部移动分析不会考虑构造
list的成本。 -
A1Distance 不是递归的。我以前让它做一件事 500 次,但是当我把它减少到 100 次时,函数调用只用了 3.114 秒。当我对它自己进行分析时,列表理解的执行时间显示为 0.000。
-
我怀疑你在函数内部移动分析时搞砸了。调用一个函数真的不太可能需要 10 秒。而改变函数内部的重复次数改变了时间这一事实意味着成本在函数中,而不是在调用中。
-
我在函数中重新运行了分析(启用是第一件事,在返回语句之前禁用),我看到了同样的事情。