避免在 timeit.repeat() 基准测试中进行昂贵的设置

Posted

技术标签:

【中文标题】避免在 timeit.repeat() 基准测试中进行昂贵的设置【英文标题】:avoid expensive setup in timeit.repeat() benchmark 【发布时间】:2012-06-12 13:01:55 【问题描述】:

我正在尝试测量我的一个小型 Python 代码 sn-p 的执行时间,我想知道这样做的最佳方法是什么。

理想情况下,我想运行某种设置(这需要很长时间),然后运行一些测试代码几次,并获得这些运行的最短时间。

timeit() 似乎合适,但我不确定如何在不重新执行设置的情况下获得最短时间。小代码sn-p演示问题:

import timeit

setup = 'a = 2.0'  # expensive
stmt = 'b = a**2'  # also takes significantly longer than timer resolution

# this executes setup and stmt 10 times and the minimum of these 10 
# runs is returned:
timings1 = timeit.repeat(stmt = stmt, setup = setup, repeat = 10, number = 1)

# this executes setup once and stmt 10 times but the overall time of
# these 10 runs is returned (and I would like to have the minimum 
# of the 10 runs):
timings2 = timeit.repeat(stmt = stmt, setup = setup, repeat = 1, number = 10)

【问题讨论】:

你能把设置例程的结果存储在一个变量中吗? 我们无法将结果存储在字符串中,因为涉及到更复杂的数据类型 (scipy.sparse.linalg.LinearOperator)。 【参考方案1】:

您是否尝试过使用datetime 为您计时?

start = datetime.datetime.now()
print datetime.datetime.now() - start #prints a datetime.timedelta object`

这将为您提供经过的时间,并且您可以用很小的开销控制它从哪里开始。

编辑:这是一个人的视频,他也用它来做一些计时,这似乎是获得运行时间的最简单方法。 http://www.youtube.com/watch?v=Iw9-GckD-gQ

【讨论】:

以上是关于避免在 timeit.repeat() 基准测试中进行昂贵的设置的主要内容,如果未能解决你的问题,请参考以下文章

数据库基准测试中应该避免的错误

如何对 Matlab 流程进行基准测试?

在 JMH 中对具有不同值的循环进行微基准测试

性能基准自动化测试

网络基准测试

如何在 Java 中编写正确的微基准测试?