наиболее эффективный способ найти минимальный 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 (), но это должен быть правильный способ сделать это.