写点什么

python 统计程序耗时 | python 小知识

作者:AIWeker
  • 2023-04-19
    福建
  • 本文字数:947 字

    阅读完需:约 3 分钟

python统计程序耗时 | python小知识

我们在做性能分析的时候,最常用的方法就是统计程序的耗时;通过分析耗时,来确定需要优化和改进的部分。


今天我们分享几个统计耗时的方法,希望对你有帮助。

1. time.time()

一种直接的方式就是利用时钟方式,统计程序前后的实时时间,然后计算耗时。


import timedef test_func_2(cnt):    start_time = time.time()    sum_v = 0    for i in range(cnt):        if i % 3 == 0:            sum_v += i    print("time is: {}".format(time.time() - start_time))    return sum_v
test_func_2(10000000)# time is: 0.5772514343261719
复制代码


由上可知,time.time()这种方式,需要变更函数内的逻辑,但是比较灵活,可以检测函数内更小代码块的耗时。也可以通过装饰器的方式来统计。

2. timeit

另一种方式是通过 python 的内置库 timeit。 timeit 中 timeit 函数提供了单个函数或者语句的耗时统计,例子如下:


from timeit import timeitdef test_func(cnt):    sum_v = 0    for i in range(cnt):        if i % 3 == 0:            sum_v += i    return sum_v
t2 = timeit("test_func(100000)", setup="from __main__ import test_func", number=1)print(t2)
复制代码


由上可知,timeit 的好处是在函数外部测试耗时,不改变函数体内容。timeit 还提供运行的次数 number;timeit 库中还提供 repeat 函数,提供反复执行的。需要注意的是 timeit 函数中 setup 是函数测试的前置命令,一般为模块导入。

3. cProfile

另一个统计耗时的工具也是 python 的内置库 cProfile。cProfile 提供了详细的性能分析信息。


import cProfilefrom timeit import timeitdef test_func(cnt):    sum_v = 0    for i in range(cnt):        if i % 3 == 0:            sum_v += i    return sum_v
cProfile.run("test_func(100000)")
复制代码



从上可知,ncalls 表示调用次数、tottime 为总耗时(不包括调用)、percall 为每次调用耗时、cumtime 为总耗时(包括调用)、percall 为每次调用耗时、filename:lineno(function)为函数信息。

4. 总结

今天分享了 3 种 python 中统计程序耗时的方法,总结如下:


  • time.time(): 最常用灵活的方式,便于发现函数中更小模块的耗时

  • timeit:在不改变函数内容的情况下方便统计函数耗时,所以尽可能拆分功能为可测试的函数模块

  • cProfile: 一个更全面的耗时统计工具

发布于: 刚刚阅读数: 4
用户头像

AIWeker

关注

InfoQ签约作者 / 公众号:人工智能微客 2019-11-21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python统计程序耗时 | python小知识_Python_AIWeker_InfoQ写作社区