以下是我运行的代码:
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
答案 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)
小名单有一点不同:
$ 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