<p>您可能会注意到<a href="http://docs.python.org/3/library/functions.html#sorted" rel="nofollow">^{<cd1>}</a>和<a href="http://docs.python.org/3/library/stdtypes.html#list.sort" rel="nofollow">^{<cd2>}</a>以及所有其他执行任何类型潜在修饰处理的函数都有一个<code>key</code>参数,而那些专门进行排序的函数也有一个<code>reverse</code>参数。(<a href="http://wiki.python.org/moin/HowTo/Sorting/" rel="nofollow">Sorting Mini-HOWTO</a>涵盖了这一点。)</p>
<p>所以,你可以看看它们是如何实现的。不幸的是,在CPython中,所有这些东西都是用C实现的。但我认为可以解释这里的关键部分,因为它非常简单。<code>list.sort</code>代码与<code>sorted</code>代码是分开的,它们都分布在大量函数上。但是如果您只查看顶层函数<a href="http://hg.python.org/cpython/file/3.3/Objects/listobject.c#l1902" rel="nofollow">^{<cd8>}</a>,您可以看到它如何处理<code>reverse</code>标志:</p>
<pre><code>1982 /* Reverse sort stability achieved by initially reversing the list,
1983 applying a stable forward sort, then reversing the final result. */
1984 if (reverse) {
1985 if (keys != NULL)
1986 reverse_slice(&keys[0], &keys[saved_ob_size]);
1987 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
1988 }
</code></pre>
<p>为什么要颠倒开头和结尾的列表?好吧,在列表一开始几乎被排序的情况下,许多排序算法,包括timsort和您的插入排序,从正确的顺序开始比从后序开始要好得多。是的,它浪费了一个O(N)<code>reverse</code>调用,但你已经在做其中一个了,因为任何排序算法都至少是O(N logn),而你的算法是O(N^2),这并不会使算法变得更糟。当然,对于较小的N,更好的排序,以及随机顺序的列表,这个浪费的2N非常接近nlogn,所以它在实践中可以起到作用。这将是一个随着N变得巨大而消失的差别,但是如果你要对数百万个小的<code>list</code>排序,而不是几个大的,那么这可能值得担心。在</p>
<p>其次,请注意,它通过创建一个反向切片来实现反转。这一点,至少在潜在的情况下,可以通过使用<code>__getitem__</code>反向引用原始的<code>list</code>对象进行优化,这意味着这两个反转实际上是O(1)。最简单的方法是创建一个反向切片:<code>lst[::-1]</code>。不幸的是,这实际上创建了一个新的reversed<code>list</code>,因此timsort包含了它自己的自定义reverse slice对象。但是您可以在Python中通过创建一个<code>ReversedList</code>类来做同样的事情。在</p>
<p>实际上,在CPython中这可能不会更快,因为额外函数调用的成本可能很高,足以掩盖差异。但您抱怨的是两个<code>reverse</code>调用的算法开销,这有效地解决了问题,与内置的排序函数一样。在</p>
<p>你也可以看看PyPy是怎么做到的。它的<code>list</code>是在<a href="https://bitbucket.org/pypy/pypy/src/9f15ce4319cf205bd7173ae0274bc567fa14ad07/pypy/objspace/std/listobject.py?at=default" rel="nofollow">^{<cd19>}</a>中实现的。根据列表包含的内容,它委托给几个不同的策略类中的一个,但是如果您查看所有的策略(除了那些没有什么要做的策略),它们基本上是做相同的事情:<code>sort</code>列表,然后<code>reverse</code>它。在</p>
<p>所以,这对CPython和PyPy来说已经足够好了……可能对你也足够好了。在</p>