Python timeit:如何在每次重复之前初始化定时函数的参数?
Python timeit: How to initialize arguments for timed function before every repetition?
假设我正在尝试测量排序函数的执行时间,这是我的代码:
import timeit
def time_algo(sort_fun, input_seq, num=100):
'''
Time how long it takes to sort sequence 'input_seq' using
function 'sort_fun'. Take min of 'num' times.
'''
foo = list(input_seq)
wrapped = wrapper(sort_fun, foo)
return min(timeit.repeat(wrapped, repeat=num, number=1))
def wrapper(func, *args):
def wrapped():
return func(*args)
return wrapped
print time_algo(list.sort, [10,9,8,7,6,5,4,3,2,1], num = 100)
问题是在第一次执行 sort_fun
之后,输入列表已经排序,并且在剩余的 num - 1
次中它在排序列表中 运行。
如何在每次重复函数计时之前初始化输入函数的参数(在本例中为执行 foo = list(input_seq)
)?或者使用 timeit
模块执行此操作的正确方法是什么(我需要准确的结果,所以我不想使用其他计时方法,如 time.clock()
等)?
我认为这个修改后的 time_algo()
符合您的要求:
def time_algo(sort_fun, input_seq, num=100):
'''
Time how long it takes to sort sequence 'input_seq' using
function 'sort_fun'. Take min of 'num' times.
'''
foo = list(input_seq)
wrapped = wrapper(sort_fun, foo)
def reset_foo():
foo[:] = list(input_seq)
return min(timeit.timeit(wrapped, setup=reset_foo, number=1) for _ in range(num))
这会在每次 timeit() 之前重新复制 input_seq 以列出 foo。有不那么花哨/更手动的方法可以更通用:你可以编写一个简单的循环来复制输入,制作一个新的包装器,然后调用 timeit。
...但是正如上面所评论的那样,您确实需要每次迭代多次迭代,为此您真的希望为一个不修改其输入的函数计时。
假设我正在尝试测量排序函数的执行时间,这是我的代码:
import timeit
def time_algo(sort_fun, input_seq, num=100):
'''
Time how long it takes to sort sequence 'input_seq' using
function 'sort_fun'. Take min of 'num' times.
'''
foo = list(input_seq)
wrapped = wrapper(sort_fun, foo)
return min(timeit.repeat(wrapped, repeat=num, number=1))
def wrapper(func, *args):
def wrapped():
return func(*args)
return wrapped
print time_algo(list.sort, [10,9,8,7,6,5,4,3,2,1], num = 100)
问题是在第一次执行 sort_fun
之后,输入列表已经排序,并且在剩余的 num - 1
次中它在排序列表中 运行。
如何在每次重复函数计时之前初始化输入函数的参数(在本例中为执行 foo = list(input_seq)
)?或者使用 timeit
模块执行此操作的正确方法是什么(我需要准确的结果,所以我不想使用其他计时方法,如 time.clock()
等)?
我认为这个修改后的 time_algo()
符合您的要求:
def time_algo(sort_fun, input_seq, num=100):
'''
Time how long it takes to sort sequence 'input_seq' using
function 'sort_fun'. Take min of 'num' times.
'''
foo = list(input_seq)
wrapped = wrapper(sort_fun, foo)
def reset_foo():
foo[:] = list(input_seq)
return min(timeit.timeit(wrapped, setup=reset_foo, number=1) for _ in range(num))
这会在每次 timeit() 之前重新复制 input_seq 以列出 foo。有不那么花哨/更手动的方法可以更通用:你可以编写一个简单的循环来复制输入,制作一个新的包装器,然后调用 timeit。
...但是正如上面所评论的那样,您确实需要每次迭代多次迭代,为此您真的希望为一个不修改其输入的函数计时。