为什么Python的"sorted()"慢于"copy,then .sort()"

Tim*_*imY 7 python sorting optimization performance

这是我运行的代码:

import timeit

print timeit.Timer('''a = sorted(x)''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000)
print timeit.Timer('''a=x[:];a.sort()''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000)
Run Code Online (Sandbox Code Playgroud)

以下是结果:

0.00259663215837
0.00207390190177
Run Code Online (Sandbox Code Playgroud)

我想知道为什么使用.sort()始终比sorted()更快,即使两者都是复制列表?

注意:我在带有Win7的2.53Ghz i5上运行Python 2.7

Sve*_*ach 8

您所看到的差异微乎其微,并且对于更长的列表完全消失.只需添加* 1000定义,x我的机器就会得到以下结果:

2.74775004387
2.7489669323
Run Code Online (Sandbox Code Playgroud)

我最好的猜测sorted()是因为你sorted()需要使用一些可以将任何可迭代复制到列表的通用代码,而直接复制列表可以假设源也是一个列表.通过CPython的使用排序的代码实际上是相同的list.sort()sorted(),所以这不是什么原因造成的差异.

编辑:当前开发版sorted()源代码确实与道德相当

a = list(x)
a.sort()
Run Code Online (Sandbox Code Playgroud)

实际上,使用此代码而不是第二个版本可以消除任何列表大小的显着速度差异.

  • 是的``list.sort`可以使用已知的大小,并且在该大小内交换元素,`sorted()`必须使用未知大小和通用迭代,因此可能必须在构建时分配内存(可能强制执行memcpy如果不是contig.),但这应该是你所说的最小.复制列表非常简单,因为它只是一个简单的malloc/memcpy操作(并创建一个新的PyObject*) (2认同)