打开收藏品的成本是多少?

时间:2015-03-25 18:12:51

标签: python collections

我正在测量不同函数的运行时间,这些函数使用不同数量的参数。我没有单独为每个函数编写测量代码,而是希望将所有内容合并为一个函数。由于每个要测量的函数都使用不同数量的参数,我认为拆包会有所帮助。

以下是代码:

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)

每次迭代都会解压缩参数,因此它会反映在结果中,这让我想知道:解包的成本是多少?

1 个答案:

答案 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()做了实际工作而不仅仅是一个空函数,那么解包的成本只是整个函数时间的一小部分。