Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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中通过多个谓词进行排序的最快排序机制_Python_Performance_Sorting - Fatal编程技术网

python中通过多个谓词进行排序的最快排序机制

python中通过多个谓词进行排序的最快排序机制,python,performance,sorting,Python,Performance,Sorting,在以下输出中,例如c、s和i,这是对长度约为20000的5维数组进行排序的最快方法(就最坏情况下的时间而言)。或者有没有什么特别的方法,而不是c,s,i我不确定将前两个与第三个和第四个进行比较有什么意义——它们做的事情不同 import operator a = [[1,0.7,1],[4,0.8,1],[5,0.8,0.99],[11,0.9,0.98]] b = sorted(a, key=lambda x:x[1], reverse=True); c = sorted(b, key=lam

在以下输出中,例如c、s和i,这是对长度约为20000的5维数组进行排序的最快方法(就最坏情况下的时间而言)。或者有没有什么特别的方法,而不是c,s,i

我不确定将前两个与第三个和第四个进行比较有什么意义——它们做的事情不同

import operator
a = [[1,0.7,1],[4,0.8,1],[5,0.8,0.99],[11,0.9,0.98]]
b = sorted(a, key=lambda x:x[1], reverse=True);
c = sorted(b, key=lambda x:x[2], reverse=True);
s = sorted(a, key=lambda x : (x[2],x[1]), reverse=True);
i = sorted(a, key = operator.itemgetter(2, 1),reverse=True);
仅按第二个元素对列表进行排序,而

sorted(a, key=lambda x:x[1], reverse=True)
仅按第三个元素对列表进行排序,而与列表之前的排序方式无关


这两种方法都按第三个和第二个元素对列表进行排序。基本上,第三个元素上的关系被第二个元素打破


性能

小的 最后一种方法速度更快,因为
lambda
函数速度较慢

中等(100K元素) 大型(3M单元)
理解这些方法的理论时间复杂度是完全相同的——它们的增长顺序是相同的,这一点很重要。这里唯一的区别是你使用的技术,它可以在速度上产生微小的差异。同样重要的是要了解,如果您正在寻找高性能,Python不是您应该使用的语言。

我不确定将前两种语言与第三种和第四种语言进行比较是否有意义-它们做的事情不同

import operator
a = [[1,0.7,1],[4,0.8,1],[5,0.8,0.99],[11,0.9,0.98]]
b = sorted(a, key=lambda x:x[1], reverse=True);
c = sorted(b, key=lambda x:x[2], reverse=True);
s = sorted(a, key=lambda x : (x[2],x[1]), reverse=True);
i = sorted(a, key = operator.itemgetter(2, 1),reverse=True);
仅按第二个元素对列表进行排序,而

sorted(a, key=lambda x:x[1], reverse=True)
仅按第三个元素对列表进行排序,而与列表之前的排序方式无关


这两种方法都按第三个和第二个元素对列表进行排序。基本上,第三个元素上的关系被第二个元素打破


性能

小的 最后一种方法速度更快,因为
lambda
函数速度较慢

中等(100K元素) 大型(3M单元)
理解这些方法的理论时间复杂度是完全相同的——它们的增长顺序是相同的,这一点很重要。这里唯一的区别是你使用的技术,它可以在速度上产生微小的差异。同样重要的是要了解,如果您希望获得高性能,Python不是您应该使用的语言。

使用
timeit
模块,看看哪一个运行得最快。方法1和2与其他方法不同。所有这些方法的时间复杂度完全相同-它们使用相同的排序算法,并且您的
函数不会做任何疯狂的事情。因此,这是一个经验问题,你可以使用所有工具来阐明。使用
timeit
模块,看看哪一个运行得最快方法1和2与其他方法不同。所有这些方法的时间复杂度完全相同-它们使用相同的排序算法,而且你的
功能不会做任何疯狂的事情。所以,这是一个经验问题,你可以使用所有工具来解释。是的,我怀疑这些差异会随着列表的增大而消失,映射键函数的开销会因排序而变得微不足道。@juanpa.arrivillaga添加了更多的数字。@COLDSPEED。Python排序是稳定的。先按次键排序,然后按主键排序是有意义的。@Amutheezavagnanam真的很感激吗?请阅读:@COOLSPEED我正在做一个机器学习项目,我更喜欢使用python,除了R和Matlab之外,有没有其他语言能够轻松地进行此类计算。(我在为我的项目实现这些功能时遇到了一些问题,我认为这些差异会随着列表的增大而消失,映射键函数的开销会因排序而变得微不足道。@juanpa.arrivillaga添加了更多的数字。@COLDSPEED.Python排序是稳定的。先按次键排序,然后按pr排序。)imary键是有意义的。@Amutheezavagnanam真的很感激吗?请阅读:@COOLSPEED我正在做一个机器学习项目,我更喜欢使用python,除了R和Matlab之外,有没有其他语言能够轻松地进行这类计算。(我在为我的项目实现这些计算时遇到了一些问题和困难。)
100000 loops, best of 3: 3.62 µs per loop
100000 loops, best of 3: 2.9 µs per loop
10 loops, best of 3: 60.7 ms per loop
10 loops, best of 3: 50.7 ms per loop
1 loop, best of 3: 2.07 s per loop
1 loop, best of 3: 1.71 s per loop