快速提问,在长列表中查找最小数字(浮点数)效率更高(10000+元素)
是吗
min(mylist)
或
mylist.sort()
然后返回
mylist[0]
或其他......
谢谢!
答案 0 :(得分:11)
首先,如果你关心Python的性能(这并不总是一件值得关注的事情,但这是另一个对话),你应该使用timeit module。即使在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的sort(timsort)对已经排序的运行的数据非常有效,因此对已经排序的列表进行排序几乎没有任何惩罚。 (2)另一方面,对随机列表进行排序要慢得多,而且随着数据变大,这种情况只会变得更糟。 (3)浮点数组上的Numpy.min()在Python列表上的运行速度比min小60倍,因为它不必像通常一样。
答案 1 :(得分:10)
如果已填充列表,min()
是最有效的方法。
在特殊情况下可能会使用一些技巧:
O(1)
中给出答案。min()
的效率很高。确保您了解效果,主要是插入速度较慢。 (credit: interjay)答案 2 :(得分:2)
好吧,你肯定要迭代整个列表,所以你的运行时应该是O(n)。
由于排序已经花费了O(n log n)时间,这显然不是最好的方法。我不知道min()的实现,但它应该是正确的方法。