如何使 timeit.Timer() 与 itertools.starmap() 的输出一起工作

How to make timeit.Timer() work with output of itertools.starmap()

我很难思考 为什么我可以让 timeit.Timer() 使用来自的输出 functools.partial() 但不是 itertools.starmap().

的输出

我基本上需要的是 starmap(func, tuples)partial(func, one_arg_only) 具有相同的 'attributes' 但更一般地说,我实际上可以同时将多个参数传递给 func。

这里最简单的解决方法是什么? 我尝试了 timeit.Timer(starmap(func,tuples)) 并且显然得到了臭名昭著的错误:

ValueError: stmt is neither a string nor callable

我想这是因为 starmap 的输出不可调用。但我该如何解决这个问题?

itertools.starmap()函数returns一个itertools.starmapiterable类型而functools.partial()returns一个functools.partial 可调用类型。 timeit.Timer() 期望第一个参数是 callable (或者它可以 exec() 的字符串)。

>>> type(itertools.starmap(lambda *args: list(args), [(1, 2)])
itertools.starmap
>>> type(functools.partial(lambda x: x+1, 1))
functools.partial

你想要做的是创建一个可调用对象,它将耗尽 itertools.starmap 返回的可迭代对象。一种方法是在星图的输出上调用 list() 函数:

# This is the function to call
>>> example_func = lambda *args: len(args)

# This is the iterable that can call the example_func
>>> func_callers = itertools.starmap(example_func, [(1, 2)])

# This is the callable that actually processes func_callers
>>> execute_callers = lambda: list(func_callers)

# And finally using the timer
>>> timeit.Timer(execute_callers)