python - timeit.timeit 的返回值是平均值还是最佳?
问题描述
文档清楚地告诉我们 timeit 命令行界面输出最好。
python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
Python接口怎么样?
>>> import timeit
>>> timeit.timeit('char in text', setup='text = "sample string"; char = "g"')
0.41440500499993504
它仍然是最好的吗?
解决方案
命令行将repeat
选项设置为 3:
-r N, --repeat=N
定时器重复多少次(默认3)
而“最好的”是这 3 个中最好的。这与number参数不同,它是在您不设置-n / --number
参数时自动为您确定的。
timeit.timeit()
另一方面,该功能不重复。它运行语句的次数,并为您提供总时间。从timeit.timeit()
文档中:
使用给定的语句、设置代码和计时器函数创建一个
Timer
实例,并通过执行次数运行其方法。timeit()
主语句的执行次数。这将执行一次 setup 语句,然后返回执行主语句多次所需的时间,以秒为单位测量为浮点数。
如果您想获得最佳结果,请使用以下timeit.repeat()
功能:
timeit.repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)
使用给定的语句、设置代码和计时器函数创建一个
Timer
实例,并使用给定的重复计数和执行次数运行它。repeat() method
但是,使用timeit.repeat()
不会为您自动调整号码范围。为此,您必须创建自己的Timer()
实例。
文档链接到实现,因此您可以在函数中看到这是如何完成的main()
;将其简化为使用默认选项时执行的代码:
t = Timer(stmt, setup, timer)
repeat = 3
for i in range(1, 10):
number = 10**i
x = t.timeit(number)
if x >= 0.2:
break
r = t.repeat(repeat, number)
best = min(r)
print "%d loops," % number,
usec = best * 1e6 / number
if usec < 1000:
print "best of %d: %.*g usec per loop" % (repeat, 3, usec)
else:
msec = usec / 1000
if msec < 1000:
print "best of %d: %.*g msec per loop" % (repeat, 3, msec)
else:
sec = msec / 1000
print "best of %d: %.*g sec per loop" % (repeat, 3, sec)
在 Python 3 中,上述内容通过新Timer.autorange()
方法和更好的比例处理得到了很大改进。
使用您的语句和设置进行演示:
>>> import timeit
>>> t = timeit.Timer('char in text', setup='text = "sample string"; char = "g"')
>>> repeat = 3
>>> for i in range(1, 10):
... number = 10**i
... x = t.timeit(number)
... if x >= 0.2:
... break
...
>>> r = t.repeat(repeat, number)
>>> best = min(r)
>>> print "%d loops," % number,
10000000 loops,
>>> usec = best * 1e6 / number
>>> if usec < 1000:
... print "best of %d: %.*g usec per loop" % (repeat, 3, usec)
... else:
... msec = usec / 1000
... if msec < 1000:
... print "best of %d: %.*g msec per loop" % (repeat, 3, msec)
... else:
... sec = msec / 1000
... print "best of %d: %.*g sec per loop" % (repeat, 3, sec)
...
best of 3: 0.0305 usec per loop
推荐阅读
- reactjs - React / Ant Design - 无法上传 XLSX
- dart - 未找到方向性小部件。InkWell 小部件需要 Directionality 小部件祖先
- pip - 升级所有过时的 pip 包丢弃失败
- django - 带有 django-decouple 的 Celery 和 .env 文件
- javascript - Javascript:“ReferenceError:未定义图标”
- node.js - Firebase Functions npm install 总是卡住
- java - EclipseLink:createNativeQuery 异常 - org.postgresql.util.PSQLException
- angular - 从 laravel 中的相关表中获取具有列别名的数据
- java - 十六进制编码器方法产生奇怪的字符串而不是 SHA-256 字符串
- android - 无法为 Android 模拟器选择系统映像