Python单条语句计时

发布时间:2022-04-22 10:04:19 人气:113 作者:多测师

  上下文管理器和timeit.timeit()方法也适合单条语句计时。除此之外,也可通过命令行执行timeit计时,命令选项详见官方帮助。

  通过命令行执行timeit计时,可方便地测量和对比相同功能不同实现表达式的性能:

  E:\PyTest>python -m timeit -r 5 "'-'.join(str(n) for n in range(100))"

  10000 loops, best of 5: 32.8 usec per loop

  E:\PyTest>python -m timeit -r 5 "'-'.join([str(n) for n in range(100)])"

  10000 loops, best of 5: 29.8 usec per loop

  E:\PyTest>python -m timeit -r 5 "'-'.join(map(str, range(100)))"

  10000 loops, best of 5: 21.8 usec per loop

Python单条语句计时

  以上三条待计时的Python表达式均被重复测试5次,每次测试中调用该表达式10000次。相同机器上运行的其他程序可能会影响计时测量,因此重复测量若干次再选取最佳结果(best time),以保证计时的准确性。考虑到后台进程等因素通常会增加总耗时,因此最佳结果取重复测量的最小值(添加-v选项可查看各次测量值),而非平均值。由本例输出结果可知,map快于列表解析,而列表解析快于生成器(生成器表达式用作参数时可省略外部的括号)。注意,这三者的快慢对比会因场景而异。例如,[x for x in range(10000)]比map(lambda x:x, range(10000))快三倍。因此,应根据Profiler工具的实测值而非"经验"来分析性能。

  此外,需注意双引号和单引号的内外位置。在作者的Windows主机上外单内双会触发"EOL while scanning string literal"的语法错误,而在Linux主机上外单内双和外双内单均可正确解析。

  再举一例:

  E:\PyTest>python -m timeit -r 5 -s "import math" "math.sqrt(255)"

  10000000 loops, best of 5: 0.188 usec per loop

  E:\PyTest>

  E:\PyTest>python -m timeit -r 5 -s "from math import sqrt" "sqrt(255)"

  10000000 loops, best of 5: 0.143 usec per loop

  类似地,此处Windows主机只接受双引号,而Linux主机单双"通吃"。由输出结果可知,使用from语句导入比常规导入更快。同时也可看到,通过导入目标模块,timeit命令行也可对其函数甚至整个模块(存在入口函数时)计时。

  最后是两点忠告:

  进行性能评估时,要牢记任何测量结果只是一个估算值。即使相当可靠的计时工具,多次测量的结果也很可能有所出入。谨慎选取最佳结果,才能尽可能保证评估的准确性。

  尽量使用标准库提供的计时工具,而不要自己编写计时函数。因为普通开发者难以全面考虑处理器时间片、后台持续或间歇运行的程序(如定时更新或杀毒)、网络连接、结果缓存、编译优化等多方面因素,导致自定义计时工具精度不高,某些情况下甚至完全偏离真实数据。

  以上内容为大家介绍了Python单条语句计时,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线