Oct-17-2018, 08:56 PM
I've tried this:
2.84397915685567
0.6598219036493851
2.251084051447339
from operator import itemgetter def n_max(seq, n=2): max_items = sorted(enumerate(seq), key=lambda x: x[1])[-1 * n:] return max_items[::-1] def my_max(seq, n=2): max_values = sorted(seq, reverse=True)[:n] indices = [seq.index(value) for value in max_values] return list(zip(indices, max_values)) def n_max_2(seq, n=2): return sorted(enumerate(seq), key=itemgetter(1), reverse=True)[:n] if __name__ == '__main__': import timeit print(timeit.timeit('n_max(seq)', setup='seq=[x for x in range(10000)]; from __main__ import n_max', number=1000)) print(timeit.timeit('my_max(seq)', setup='seq=[x for x in range(10000)]; from __main__ import my_max', number=1000)) print(timeit.timeit('n_max_2(seq)', setup='seq=[x for x in range(10000)]; from __main__ import n_max_2, itemgetter', number=1000))and the results are:
2.84397915685567
0.6598219036493851
2.251084051447339