如果将生成器表达式重写为map调用(或者,对于2.x,imap):max(map(len, words))
…实际上比密钥版本快一点,而不是慢一点。
python.org 64位3.3.0:In [186]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [188]: %timeit max(len(w) for w in words)
%10000 loops, best of 3: 90.1 us per loop
In [189]: %timeit len(max(words, key=len))
10000 loops, best of 3: 57.3 us per loop
In [190]: %timeit max(map(len, words))
10000 loops, best of 3: 53.4 us per loop
Apple 64位2.7.2:In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [299]: %timeit max(len(w) for w in words)
10000 loops, best of 3: 99 us per loop
In [300]: %timeit len(max(words, key=len))
10000 loops, best of 3: 64.1 us per loop
In [301]: %timeit max(map(len, words))
10000 loops, best of 3: 67 us per loop
In [303]: %timeit max(itertools.imap(len, words))
10000 loops, best of 3: 63.4 us per loop
我认为它比key版本更像Python,原因和genexp相同。
它是否和genexp版本一样是Python,这是有争议的。有些人喜欢map/filter/reduce/etc;有些人讨厌它们;我个人的感觉是,当你试图映射一个已经存在并且有一个好名字的函数(也就是说,一些你不必lambda或partial向上的函数)时,map会更好,但是YMMV(特别是如果你的名字是Guido)。
最后一点:the redundancy of len being called twice seems not to matter - does more happen in C code in this form?
这样想:您已经调用了lenN次。相反,调用它N+1次几乎不可能有什么不同,与您必须执行的任何操作N次相比,除非您有个小个大字符串。