我正在测量不同函数的运行时间,这些函数使用不同数量的参数。我没有单独为每个函数编写测量代码,而是希望将所有内容合并为一个函数。由于每个要测量的函数都使用不同数量的参数,我认为拆包会有所帮助。
以下是代码:
import resource
def resource_runtime_unpack(f, repeats, args):
"""
Measures running time of a function using the resource module.
Index 0 is user time, index 1 is the system time.
Unpacks a list of arguments into the function.
"""
start = resource.getrusage(resource.RUSAGE_SELF)
for i in xrange(repeats):
f(*args)
end = resource.getrusage(resource.RUSAGE_SELF)
return (end.ru_utime - start.ru_utime,
end.ru_stime - start.ru_stime)
每次迭代都会解压缩参数,因此它会反映在结果中,这让我想知道:解包的成本是多少?
答案 0 :(得分:1)
您可以使用timeit
module:
>>> import timeit
>>> def variable_args_factory(n):
... template = 'def noop({}): pass'
... args = ', '.join(['arg{}'.format(i) for i in xrange(n)])
... namespace = {}
... exec(template.format(args), namespace)
... return namespace['noop']
...
>>> timeit.timeit('noop()', 'from __main__ import variable_args_factory; noop = variable_args_factory(0)')
0.08463001251220703
>>> timeit.timeit('noop(*args)', 'from __main__ import variable_args_factory; noop = variable_args_factory(0); args = []')
0.11967301368713379
>>> timeit.timeit('noop(*args)', 'from __main__ import variable_args_factory; noop = variable_args_factory(10); args = [None] * 10')
0.22447800636291504
>>> timeit.timeit('noop(*args)', 'from __main__ import variable_args_factory; noop = variable_args_factory(100); args = [None] * 100')
1.5113048553466797
>>> timeit.timeit('noop(*args)', 'from __main__ import variable_args_factory; noop = variable_args_factory(1000); args = [None] * 1000')
12.78959608078003
所以是的,解包参数的成本随着参数数量的增加而增加。上面的时间是每100万次调用,所以一个包含10个参数的列表大约需要两倍的时间来解压缩为带有0个参数的列表。
然而,开销很小;如果noop()
做了实际工作而不仅仅是一个空函数,那么解包的成本只是整个函数时间的一小部分。