ジェネレータ式を呼び出しとして書き直す場合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
genexpと同じ理由で、バージョンよりもpythonicだと思います。
それがgenexpバージョンと同じくらいpythonicであるかどうかは議論の余地があります。map
一部の人々は///などを愛していますfilter
。reduce
嫌いな人もいます。私の個人的な感想は、すでに存在し、素敵な名前(つまり、必要のないもの)を持つ関数をマップしようとしているときは、lambda
よりpartial
良いmap
ですが、YMMV(特にあなたの名前がGuidoの場合) 。
最後にもう1つ:
lenが2回呼び出される冗長性は問題ではないようですが、この形式のCコードではさらに多くのことが起こりますか?
このように考えてください:あなたはすでにlen
N回電話をかけています。代わりにそれを回と呼ぶことは、あなたが数回の巨大な文字列を持っていない限り、あなたが何回もしなければならないことN+1
と比較して、違いを生む可能性はほとんどありません。N