在Python中调用函数集的有效方法

时间:2009-11-23 20:52:02

标签: python iteration

我有一套功能:

functions=set(...)

所有功能都需要一个参数x。

在python中执行类似操作的最有效方法是什么:

for function in functions:
   function(x)

4 个答案:

答案 0 :(得分:7)

您提供的代码,

for function in functions:
    function(x)

...似乎没有对调用function(x)的结果做任何事情。如果确实如此,意味着这些功能被称为副作用,那么就没有更多的pythonic替代品了。 只需保留您的代码。 具体来说,回到这里的重点是

在列表推导中避免使用带副作用的函数。

至于效率:我希望使用其他任何东西而不是简单的循环都不会改善运行时。如有疑问,请使用timeit。例如,以下测试似乎表明常规for循环比列表理解更快。 (我不愿意从这个测试得出任何一般性的结论,思考):

>>> timeit.Timer('[f(20) for f in functions]', 'functions = [lambda n: i * n for i in range(100)]').repeat()
[44.727972984313965, 44.752119779586792, 44.577917814254761]
>>> timeit.Timer('for f in functions: f(20)', 'functions = [lambda n: i * n for i in range(100)]').repeat()
[40.320928812026978, 40.491761207580566, 40.303879022598267]

但是,再次,即使这些测试表明列表推导更快,但为了便于阅读,仍然不应该在涉及副作用时使用它们。


:好吧,我写了for f in functions,因此functionfunctions之间的区别更为明显。但这不是这个问题的关键所在。

答案 1 :(得分:1)

如果您需要输出,列表理解将起作用。

[func(x) for func in functions]

答案 2 :(得分:0)

我有点怀疑这会对你的程序的总运行时间产生多大的影响,但我想你可以这样做:

[func(x) for func in functions]

缺点是你会创建一个你立即抛弃的新列表,但它应该比for-loop稍快一些。

在任何情况下,请确保您对代码进行分析,以确认这确实是您需要处理的瓶颈。

答案 3 :(得分:0)

编辑:我使用timeit重新编写测试

我的新测试代码:

import timeit

def func(i):
    return i;

a = b = c = d = e = f = func

functions = [a, b, c, d, e, f]

timer = timeit.Timer("[f(2) for f in functions]", "from __main__ import functions")
print (timer.repeat())

timer = timeit.Timer("map(lambda f: f(2), functions)", "from __main__ import functions")
print (timer.repeat())

timer = timeit.Timer("for f in functions: f(2)", "from __main__ import functions")
print (timer.repeat())

以下是此时间的结果。

testing list comprehension
[1.7169530391693115, 1.7683839797973633, 1.7840299606323242]

testing map(f, l)
[2.5285000801086426, 2.5957231521606445, 2.6551258563995361]    

testing plain loop
[1.1665718555450439, 1.1711149215698242, 1.1652190685272217]

我的原始,基于time.time()的计时与此测试非常相似,简单的循环似乎是最有效的。