我有一个对象列表,我想遍历列表并为每个对象调用一个方法。显然,这是过度优化,更像是“哦,我想知道什么是最快的方法”,而不是“必须让每个周期都具有速度”。我可以想出几种方法来做到这一点,并对它们进行一些分析,得到以下结果:
; ipython
Python 2.7.5 (default, Jun 17 2014, 18:11:42)
Type "copyright", "credits" or "license" for more information.
IPython 2.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1] class ook:
def eek(self):
pass
In [2] lst = [ook(), ook(), ook(), ook(), ook(), ook(), ook(), ook()]
In [3] %timeit -n 10000 map(lambda x: x.eek(), lst)
10000 loops, best of 3: 2.17 µs per loop
In [4] %timeit -n 10000 [x.eek() for x in lst]
10000 loops, best of 3: 2.32 µs per loop
In [5] def test(lst):
for x in lst:
x.eek()
In [6] %timeit -n 10000 test(lst)
10000 loops, best of 3: 2.18 µs per loop
标准循环方法似乎在可读性方面胜出,但 map 解决方案看起来更快一些。
我错过了什么吗?
有没有更好的办法?
请您参考如下方法:
如果您只想调用列表中的所有函数,for 循环应该是最有效的,因为它不会创建新列表(实际上它在我的机器上是最有效的)。
另请注意,在 Python 3 中,map 解决方案将不起作用,因为它会创建稍后计算的生成器。
