Я нашел, что это будет последовательно быстрее (примерно в 2 раза для списка 1000000 элементов), чем heapq.nlargest
:
def two_largest(sequence):
first = second = 0
for item in sequence:
if item > second:
if item > first:
first, second = item, first
else:
second = item
return first, second
(функция, модифицированная по предложению MatthieuW)
Здесь приведены результаты ц моего тестирования (timeit
принимает навсегда, так что я использовал time.time()
):
>>> from random import shuffle
>>> from time import time
>>> seq = range(1000000)
>>> shuffle(seq)
>>> def time_it(func, *args, **kwargs):
... t0 = time()
... func(*args, **kwargs)
... return time() - t0
...
>>> #here I define the above function, two_largest().
>>> from heapq import nlargest
>>> time_it(nlargest, 2, seq)
0.258958101273
>>> time_it(two_largest, seq)
0.145977973938
возможно дубликат [Фильтр макс 20 значений из списка целых чисел] (http://stackoverflow.com/questions/9757289/filter -max-20-values-from-a-list-of-integers) –