Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表上的Python sort()方法与内置的sorted()函数_Python_Sorting - Fatal编程技术网

列表上的Python sort()方法与内置的sorted()函数

列表上的Python sort()方法与内置的sorted()函数,python,sorting,Python,Sorting,我知道,\uuuuuu内置的sorted()函数适用于任何iterable。但是有人能解释一下anylist.sort()和sorted(anylist)之间的巨大(10倍)性能差异吗?另外,请指出,如果我在测量方法上有任何错误 """ Example Output: $ python list_sort_timeit.py Using sort method: 20.0662879944 Using sorted builin method: 259.009809017 """ impor

我知道,
\uuuuuu内置的
sorted()函数适用于任何iterable。但是有人能解释一下anylist.sort()和sorted(anylist)之间的巨大(10倍)性能差异吗?另外,请指出,如果我在测量方法上有任何错误

""" Example Output: $ python list_sort_timeit.py Using sort method: 20.0662879944 Using sorted builin method: 259.009809017 """ import random import timeit print 'Using sort method:', x = min(timeit.Timer("test_list1.sort()","import random;test_list1=random.sample(xrange(1000),1000)").repeat()) print x print 'Using sorted builin method:', x = min(timeit.Timer("sorted(test_list2)","import random;test_list2=random.sample(xrange(1000),1000)").repeat()) print x """ 示例输出: $python list\u sort\u timeit.py 使用排序方法:20.0662879944 使用分类别林方法:259.009809017 """ 随机输入 导入时间信息 打印“使用排序方法:”, x=min(timeit.Timer(“test_list1.sort()”,“import random;test_list1=random.sample(xrange(1000),1000)”)。重复() 打印x 打印“使用已排序的builin方法:”, x=min(timeit.Timer(“排序(test_list2)”,“导入随机;test_list2=random.sample(xrange(1000),1000)”)。重复() 打印x
正如标题所说,我对比较list.sort()和sorted(list)感兴趣。上面的代码片段显示了一些有趣的事情,python的排序函数对于已经排序的数据表现得非常好。正如Anurag所指出的,在第一种情况下,排序方法处理的是已经排序的数据,而在第二种情况下,排序方法处理的是一次又一次的新数据

所以我写这篇文章是为了测试,是的,它们非常接近

""" Example Output: $ python list_sort_timeit.py Using sort method: 19.0166599751 Using sorted builin method: 23.203567028 """ import random import timeit print 'Using sort method:', x = min(timeit.Timer("test_list1.sort()","import random;test_list1=random.sample(xrange(1000),1000);test_list1.sort()").repeat()) print x print 'Using sorted builin method:', x = min(timeit.Timer("sorted(test_list2)","import random;test_list2=random.sample(xrange(1000),1000);test_list2.sort()").repeat()) print x """ 示例输出: $python list\u sort\u timeit.py 使用排序方法:19.0166599751 使用分类别林方法:23.203567028 """ 随机输入 导入时间信息 打印“使用排序方法:”, x=min(timeit.Timer(“test\u list1.sort()”,“import random;test\u list1=random.sample(xrange(1000),1000);test\u list1.sort()”)。repeat()) 打印x 打印“使用已排序的builin方法:”, x=min(timeit.Timer(“排序(test_list2)”,“导入随机;test_list2=random.sample(xrange(1000),1000);test_list2.sort()”)。重复() 打印x 哦,我看到亚历克斯·马泰利在回答,我正在打这封信。。(我将保留编辑,因为它可能会有用)。

好吧,列表的
.sort()
方法将对列表进行排序,而
sorted()
将创建一个新列表。因此,如果您有一个大的列表,您的性能差异的一部分将是由于复制

不过,一个数量级的差异似乎比我预期的要大。也许
list.sort()
有一些特殊情况的优化,
sorted()
无法利用。例如,由于
list
类已经有一个大小合适的内部
Py_对象*[]
数组,因此它可能可以更有效地执行交换


编辑:Alex和Anurag是对的,数量级的差异是由于您在测试用例中意外地对已经排序的列表进行排序。然而,正如Alex的基准测试所显示的,
list.sort()
sorted()
快约2%,这是因为复制开销的缘故。

因为list.sort进行就地排序,所以第一次排序时,但下次排序时,您将对排序后的列表进行排序

e、 试试这个,你会得到同样的结果 在timeit的情况下,大部分时间用于复制和排序,也用于多复制一次

import time
import random
test_list1=random.sample(xrange(1000),1000)
test_list2=random.sample(xrange(1000),1000)

s=time.time()
for i in range(100):
    test_list1.sort()
print time.time()-s

s=time.time()
for i in range(100):
    test_list2=sorted(test_list2)
print time.time()-s

测量中的错误如下:在第一次调用
test\u list1.sort()
之后,列表对象被排序了--Python的sort,aka,在已经排序的列表上是非常快的!!!这是使用
timeit
时最常见的错误——无意中产生了副作用,而没有考虑这些副作用

下面是一组很好的测量值,最好使用命令行中的
timeit

$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
y=list(x); y.sort()'
1000 loops, best of 3: 452 usec per loop
$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
x.sort()'
10000 loops, best of 3: 37.4 usec per loop
$ python -mtimeit -s'import random; x=range(1000); random.shuffle(x)' '
sorted(x)'
1000 loops, best of 3: 462 usec per loop

正如您所看到的,
y.sort()
sorted(x)
是并驾齐驱的,但是
x.sort()
由于副作用,它比一个数量级的优势更具优势——这仅仅是因为您的测量误差:这并没有告诉您有关
sort
sorted
本身的任何信息

顺便说一句,既然这是一个有合理答案的问题,它可能不应该是社区维基。好的,我会记住的,丹尼尔。这是一个很好的指针。是的,你正确地指出了它。我确实知道[].sort()的就地排序,但不知何故,我一直在寻找这两种算法是否有任何差异(这是突然出现的)。在已经排序的列表中,[].sort()似乎工作得很好。顺便说一句,出于许多原因[1],我会使用timeit来显示示例代码段,而不是time.time。使用timeit进行单次执行时,结果相同。谢谢亚历克斯!您能否解释一下,为什么就地排序所用的时间比排序()返回的列表所用的时间要少一些?丹尼尔提到复制,但我们还没有复制任何东西,对吗?我假设sorted()生成的排序列表是一个内存操作,返回时会分配一个新的列表对象。@Senthil:列表中的对象不应该被复制,但列表本身是(例如,在
y=sorted(x)
之后,您有两个列表副本,
x
y
)。因此,
sorted()
调用至少需要将
malloc(n*sizeof(PyObject*))
n
指针从第一个列表复制到新列表。我猜复制那些
n
指针可以弥补Alex的基准测试显示的大约2%的时间差。@Daniel,是的,malloc本身加上指针的“复制”。只需将它作为一个简单的列表浅层复制操作(我建议在命令行上这样做!-)来查看它所占的时间。我还比较了迭代器上的list.sort()和sorted()的结果,结果似乎是等效的:
python-mtimeit-s'import random;[random.random()用于xrange(1000)中的x)].sort()':100000000个循环,每个循环的最佳值为3:0.00899 usec;排序(random.random()表示x范围内的x(1000))”:100000000个循环,每个循环的最佳值为3:0.00891 usec;值在每次运行时都会被不同的
shuffle
,(
random
在每次Python启动时被重新设定种子),因此数据是o