наиболее эффективный способ найти минимальный float в списке python

быстрый вопрос, который более эффективен для поиска наименьшего числа (float) в длинном списке (10000+ элементов)

это

min(mylist)

или

mylist.sort() 

и затем вернуть

mylist[0]

или что-то еще...

спасибо!

3 ответов


Если список уже заполнен, min() - самый эффективный способ.

есть некоторые трюки, которые вы можете использовать в специальных сценариях:

  • если вы создаете список с нуля, просто держите наименьший элемент еще во внешней переменной, так что ответ будет дан в O(1).
  • если в списке есть только поплавки, используйте массив что дает лучшую производительность.
  • вы можете сохранить список отсортированных с помощью bisect.
  • использовать Куча Python, который даже имеет эффективную реализацию min(). Убедитесь, что вы понимаете эффекты, в основном более медленную вставку. (кредит: interjay)

во-первых, если вы заботитесь о производительности в Python (что не всегда разумно, но это другой разговор), вы должны использовать модуль timeit. Даже в C трудно предсказать, как некоторые функции будут вести себя после компиляции, и это сложнее в Python. Люди часто уверенно выражают мнения о том, какие функции быстрее, какие зависят от данных. Тогда-используя timeit, я имею в виду-вы могли бы узнать себе.

во-вторых, если вы действительно забота о производительности в списках поплавков, вы не должны использовать списки, но массивы numpy. Использование IPython здесь, под Python 2.7.2, что упрощает синхронизацию:

In [41]: import random, numpy
In [42]: a = [0.1*i for i in range(10**5)]
In [43]: timeit min(a)
100 loops, best of 3: 4.55 ms per loop
In [44]: timeit sorted(a)[0]
100 loops, best of 3: 4.57 ms per loop
In [45]: random.shuffle(a)
In [46]: timeit min(a)
100 loops, best of 3: 6.06 ms per loop
In [47]: timeit min(a) # to make sure it wasn't a fluke
100 loops, best of 3: 6.07 ms per loop
In [48]: timeit sorted(a)[0]
10 loops, best of 3: 65.9 ms per loop
In [49]: b = numpy.array(a)
In [50]: timeit b.min()
10000 loops, best of 3: 97.5 us per loop

и мы отмечаем несколько вещей. (1) сортировка Python (timsort) очень хорошо работает с данными, которые отсортированы, поэтому сортировка уже отсортированного списка почти не имеет штрафа. (2) сортировка случайного списка, с другой стороны, намного медленнее, и это будет только хуже, как данные становятся больше. (3) и NumPy.min () в массиве float работает в шестьдесят раз быстрее, чем min в списке Python, потому что он не должен быть общим.


Ну, вам определенно нужно перебирать весь список, поэтому ваша среда выполнения должна быть O (n).

поскольку сортировка уже занимает время O (N log n), это, очевидно, не лучший способ сделать это. Я не знаю реализации min (), но это должен быть правильный способ сделать это.