Jeśli przepisujesz wyrażenie generatora jako wywołanie map
(lub, dla 2.x, imap
):
max(map(len, words))
... to faktycznie nieco szybciej niż w wersji kluczowej, nie wolniej.
python.org 64-bit 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
Jabłko 64-bit 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
myślę, że to bardziej pythonic niż wersja key
, z tego samego powodu genexp jest.
Można argumentować, czy jest to wersja pythonic, jak wersja genexp. Niektórzy ludzie lubią map
/filter
/reduce
/itp .; niektórzy nienawidzą ich; moim osobistym odczuciem jest to, że kiedy próbujesz odwzorować funkcję, która już istnieje i ma ładne imię (to znaczy, że nie musisz tego robić),lub partial
) jest ładniejsza, ale YMMV (szczególnie jeśli masz na imię jest Guido).
Ostatni punkt:
zwolnienie od len nazywany jest dwa razy wydaje się nie ma znaczenia - nie więcej zdarzyć w kodzie C w tej formie?
Pomyśl o tym tak: już dzwonisz pod numer len
N razy. Wywoływanie go w wersji N+1
jest raczej mało prawdopodobne, aby coś zmienić, w porównaniu do wszystkiego, co musisz zrobić N
razy, chyba że masz mały numer ogromny ciągów.
@isedev że dam słowo, a nie długość słowa –
osobiście wolę to drugie, wygląda ładniejsze – Wolph
'' DŁ (max (słowa, key = LEN)) '' jest dobry ponieważ służy jako * Och, zapomniałem '' max'' wziął klucz jako argument. * Przypomnienie dla wet-ware. – sotapme