我有一套功能:
functions=set(...)
所有功能都需要一个参数x。
在python中执行类似操作的最有效方法是什么:
for function in functions:
function(x)
答案 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
,因此function
和functions
之间的区别更为明显。但这不是这个问题的关键所在。
答案 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()的计时与此测试非常相似,简单的循环似乎是最有效的。