函数调用需要10秒

时间:2015-10-08 00:53:12

标签: python function cprofile

我用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()INSIDE放在函数中,它的输出是相同的,但A1Distance没有10秒。因此,仅仅调用一个函数似乎需要10秒钟。对于可能是什么原因/解决方法的任何建议?

1 个答案:

答案 0 :(得分:1)

这是你的list_comprehension需要10秒钟。在调用函数之前,会对函数的参数进行求值,因此如果您在函数内部进行了剖析,则已经完成了昂贵的list_comprehension

见例如:

import time, cProfile

def func_a(a_list):
    return len(a_list)

def func_b(a_list, pr):
    pr.enable()
    ret = len(a_list)
    pr.disable()
    return ret


def main():
    pr = cProfile.Profile()
    pr.enable()
    func_a([time.sleep(x) for x in range(3)])
    pr.disable()
    pr.print_stats()

    pr = cProfile.Profile()
    func_b([time.sleep(x) for x in range(3)], pr)
    pr.print_stats()

    pr = cProfile.Profile()
    pr.enable()
    [time.sleep(x) for x in range(3)]
    pr.disable()
    pr.print_stats()

if __name__ == '__main__':
    main()

将输出如下内容:

     7 function calls in 3.006 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 tmp.py:3(func_a)
    1    0.000    0.000    0.000    0.000 {len}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    1    0.000    0.000    0.000    0.000 {range}
    3    3.006    1.002    3.006    1.002 {time.sleep}


     2 function calls in 0.000 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 {len}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


     5 function calls in 3.004 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    1    0.000    0.000    0.000    0.000 {range}
    3    3.004    1.001    3.004    1.001 {time.sleep}