Nếu bạn viết lại biểu thức trình tạo dưới dạng cuộc gọi map
(hoặc, cho 2.x, imap
):
max(map(len, words))
… nó thực sự nhanh hơn một chút so với phiên bản chính, không chậm hơn.
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
của Apple 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
Tôi nghĩ đó là hơn pythonic so với phiên bản key
, với cùng lý do genexp là.
Có thể tranh cãi cho dù đó là pythonic như phiên bản genexp. Một số người yêu thích số map
/filter
/reduce
/etc; một số ghét họ; cảm giác cá nhân của tôi là khi bạn đang cố gắng ánh xạ một hàm đã tồn tại và có một tên đẹp (nghĩa là, bạn không cần phải lambda
hoặc partial
), map
đẹp hơn, nhưng YMMV (đặc biệt là nếu tên của bạn) là Guido).
Một điểm cuối cùng:
sự dư thừa của len được gọi hai lần dường như không thành vấn đề - không xảy ra hơn trong mã C theo hình thức này?
Hãy nghĩ về điều này như sau: Bạn đã gọi số len
N lần. Gọi nó là N+1
lần thay vì hầu như không có khả năng tạo sự khác biệt, so với bất cứ điều gì bạn phải làm N
lần, trừ khi bạn có số nhỏ số lớn.
@isedev mà sẽ cung cấp cho các văn bản, không phải là chiều dài của từ –
Cá nhân tôi thích thứ hai, trông đẹp hơn – Wolph
'' len (max (từ, key = len)) '' là tốt bởi vì nó phục vụ như là một * Oh tôi quên '' max'' mất chìa khóa như là một đối số. * nhắc nhở cho các đồ ướt. – sotapme