2012-01-17 74 views

回答

4

注意,在許多情況下,排序依據Ordering可以比SortBy更快,因爲它使我們能夠利用矢量。在這種特殊情況下,加速並不是很大:

In[50]:= test = RandomInteger[10,{5000000,5}]; 

In[54]:= (res1=SortBy[test,{Total}]);//Timing 
(res2 = test[[Ordering[Total[test,{2}]]]]);//Timing 
res1===res2 

Out[54]= {1.422,Null} 
Out[55]= {1.125,Null} 
Out[56]= True 

但是,這是因爲Total是一個內置的功能。引入SortBy的全部原因是效率(即,對於單個比較函數,對於幾個比較函數作爲繫帶破壞者,也是方便的)。 Sort更有效率,因爲它更具體,因此在主評估序列中通過了更多步驟。但是,SortBy無法利用排序所基於的函數的可列表性(向量化本質) - 它將逐一應用於列表元素。訂購的解決方案明確地利用排序功能的整個銷售計算的可能性(在這種情況下,Total[#,{2}]&這樣做),因此速度更快。

如果,例如,該任務將是根據一個總在每個子列表中的第二,第三和第四元件的排序,我們會看到一個較大的性能差異:

In[60]:= (res3=SortBy[test,{Total[#[[2;;4]]]&}]);//Timing 
(res4=test[[Ordering[Total[test[[All,2;;4]],{2}]]]]);//Timing 
res3==res4 

Out[60]= {2.39,Null} 
Out[61]= {1.11,Null} 
Out[62]= True 

通常,性能提升對於分類函數來說是最大的,這些分類函數既是計算密集型的又是矢量化的,並且在應用於整個列表時速度更快。但是,請注意,對於大型列表,排序的性能提升永遠不會像排序函數本身那樣大。這是因爲排序的內在複雜性,其與n*Log[n]對於長度爲n的大列表成比例,並且這種複雜性將始終在那裏。

+0

很酷的提示。謝謝。 :) – 2012-01-19 01:54:34

8

在文檔中檢查SortBy列出了一系列排序列表的可能性。

SortBy[A,Total] 

給出你所需要的。

編輯:低於每嚮導先生的評論,並在其中的鏈接解釋,

SortBy[A,{Total}] 

更好。

+0

@Mr Wizard在前幾天評論了另一個排序問題,看起來'SortBy [A,{Total}]'會稍微快一點。 – 2012-01-17 06:13:55

+0

謝謝@Mike。很有意思;這聽起來像是一個老式的Mr.Wizard發現。你還記得這個問題或鏈接嗎? – kglr 2012-01-17 06:32:08

+0

除了在過去的3-4天內不是非正式的,而是與排序有關的問題。現在得走了,否則我會尋找它。 – 2012-01-17 06:44:20

0

下應該工作(但我現在不能測試):

Sort[A, Total[#1]<Total[#2]&] 
相關問題