事實上,根據我的測試,你的greatest
版本速度更快 - 通過比特,反正:
>>> def greatest_orig(values):
... value_generator = (v for k,v in values)
... max_value = max(value_generator)
... return (k for k,v in values if v == max_value)
...
>>> def greatest_max_key(values):
... max_value = max(values, key=itemgetter(1))[1]
... return (k for k,v in values if v == max_value)
...
>>> sample_data = tuple(('id' + str(i), random.randrange(0, 1000)) for i in range(10000))
>>> list(greatest_orig(sample_data)) == list(greatest_max_key(sample_data))
True
>>> %timeit list(greatest_orig(sample_data))
1000 loops, best of 3: 1.67 ms per loop
>>> %timeit list(greatest_max_key(sample_data))
1000 loops, best of 3: 1.74 ms per loop
當然,如果你不喜歡你的分配生成器的名稱,你可以通過發電機最大直接 - 方式超過max(values, key=itemgetter(1))[1]
可讀性,恕我直言:
>>> def greatest_max_iter(values):
... max_value = max((v for k, v in values))
... return (k for k, v in values if v == max_value)
...
>>> list(greatest_orig(sample_data)) == list(greatest_max_iter(sample_data))
True
>>> %timeit list(greatest_max_iter(sample_data))
1000 loops, best of 3: 1.67 ms per loop
Python允許你做的事情時,這樣的省略外的括號:
>>> def greatest_max_iter(values):
... max_value = max(v for k, v in values)
... return (k for k, v in values if v == max_value)
...
但對於原因,我不明白,做這樣的說法是稍微慢一些:
>>> %timeit list(greatest_max_iter(sample_data))
1000 loops, best of 3: 1.69 ms per loop
這些都是真實的微優化,不可能多大關係。但我認爲或max((v for k, v in values))
的可讀性優於max(values, key=itemgetter(1))[1]
。
這隻會返回一個值。 – Johnsyweb
@Johnsyweb,這正好代替了OP max_value的計算。編輯以防止誤解 – joaquin