7

这是我运行的代码:

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

4

2 回答 2

8

您正在查看的差异是微乎其微的,并且对于更长的列表完全消失。简单地添加* 1000到我的机器上的定义x给出以下结果:

2.74775004387
2.7489669323

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

编辑当前开发版本的源代码sorted()在道德上等同于

a = list(x)
a.sort()

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

于 2012-07-18T18:13:14.540 回答
1

支持@Sven Marnach 的回答

小列表有一个小的区别:

$ 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
于 2012-07-18T18:20:36.970 回答