【发布时间】:2023-03-31 16:30:01
【问题描述】:
我发现max 比 Python 2 和 3 中的 sort 函数慢。
Python 2
$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 239 usec per loop
$ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 342 usec per loop
Python 3
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]'
1000 loops, best of 3: 252 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a)'
1000 loops, best of 3: 371 usec per loop
为什么是 max (O(n)) 比 sort 函数 (O(nlogn)) 慢?
【问题讨论】:
-
a.sort()就地工作。试试sorted(a) -
@AndreaCorbellini 但 sorted(a) 需要
O(n)内存,而 max(a) 只需要一个 -
@WeizhongTu 但
sort排序,然后a永远排序 -
另外值得注意的是:python 使用 Timsort。该算法在已经排序的列表上进行
n-1比较,这与max必须做的数字相同。事实上,即使输入是“部分排序的”,Timsort 也会进行 O(n) 比较。即使在排序的情况下,其他算法也可能需要 O(nlogn) 时间。
标签: python sorting max python-internals