he encontrado que esto es consistentemente más rápido (aproximadamente 2x para una lista de artículos 1.000.000) que 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
(función modificada por sugerencia de MatthieuW)
Aquí están los resultados ct de mis pruebas (timeit
estaba tomando para siempre, por lo que utilizan 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
posible duplicado del filtro [max 20 valores de una lista de números enteros] (http://stackoverflow.com/questions/9757289/filter -max-20-values-from-a-list-of-integers) –