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

时间:2012-07-18 18:04:15

标签: python performance sorting optimization

以下是我运行的代码:

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)

以下是结果:

0.00259663215837
0.00207390190177

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

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

2 个答案:

答案 0 :(得分:8)

您所看到的差异微乎其微,并且对于更长的列表完全消失。只需将* 1000添加到x的定义中,即可在我的计算机上显示以下结果:

2.74775004387
2.7489669323

我最好猜测sorted()对你来说稍微慢一点的原因是sorted()需要使用一些可以将任何迭代复制到列表中的通用代码,而直接复制列表可以假设源也是列表。 CPython使用的排序代码对于list.sort()sorted()实际上是相同的,所以这不是造成差异的原因。

修改source code of the current development version of sorted()符合

的道德标准
a = list(x)
a.sort()

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

答案 1 :(得分:1)

支持@Sven Marnach's answer

小名单有一点不同:

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]; s=sorted" "a=s(x)"
1000000 loops, best of 3: 1.87 usec per loop

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]" "a=x[:];a.sort()"
1000000 loops, best of 3: 1.66 usec per loop

* 1000(较大的列表)的差异消失了:

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000; s=sorted" "a=s(x)"
100 loops, best of 3: 3.42 msec per loop

$ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000" "a=x[:];a.sort()"
100 loops, best of 3: 3.48 msec per loop