我整理了四份类似的 list .榜单d总是比其他榜单花的时间长得多,所有这些榜单花的时间都差不多:

a:  33.5 ms
b:  33.4 ms
c:  36.4 ms
d: 110.9 ms

为什么会这样呢?

测试脚本(Attempt This Online!):

from timeit import repeat

n = 2_000_000
a = [i // 1 for i in range(n)]  # [0, 1, 2, 3, ..., 1_999_999]
b = [i // 2 for i in range(n)]  # [0, 0, 1, 1, 2, 2, ..., 999_999]
c = a[::-1]                     # [1_999_999, ..., 3, 2, 1, 0]
d = b[::-1]                     # [999_999, ..., 2, 2, 1, 1, 0, 0]

for name in 'abcd':
    lst = eval(name)
    time = min(repeat(lambda: sorted(lst), number=1))
    print(f'{name}: {time*1e3 :5.1f} ms')

推荐答案

正如btilly和amadan在 comments 中提到的,这是由于Timsort排序算法的工作方式.详细的算法说明是here.

Timsort通过识别已排序元素的运行来加快对部分已排序数组的操作.

run 是 "升序",表示非递减:

A0<;=a1<;=a2<;=...

或"Downending",意思是严格递减:

A0>;A1>;a2>;…

请注意,运行始终至少有2个长度,除非我们从数组的 最后一个元素.

您的数组abc每个仅包含一次运行. 数组d具有1百万个游程.

降序运行不能是>=的原因是为了使排序稳定,即保持元素的相等顺序:

下降的定义是严格的,因为主 routine 颠倒了 就地下降跑道,将下降跑道转换为上升跑道 跑.反转是通过从每个元素开始的明显快速的"交换元素"完成的 方法,这可能会 destruct solidity ,如果 切片包含任何相等的元素.使用严格的定义 降序确保降序管路包含不同的元素.

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

DataFrame groupby函数从列返回数组而不是值

Polars LazyFrame在收集后未返回指定的模式顺序

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

Gekko:Spring-Mass系统的参数识别

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

如何根据一列的值有条件地 Select 前N组?

如何并行化/加速并行numba代码?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

交替字符串位置的正则表达式

无法在Spyder上的Pandas中将本地CSV转换为数据帧

如何合并具有相同元素的 torch 矩阵的行?

为用户输入的整数查找根/幂整数对的Python练习

在第一次调用时使用不同行为的re. sub的最佳方式

如何获得满足掩码条件的第一行的索引?

分解polars DataFrame列而不重复其他列值

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

将像素信息写入文件并读取该文件

大型稀疏CSR二进制矩阵乘法结果中的错误

具有不同坐标的tkinter canvs.cocords()和canvs.moveto()