2012-01-17 4 views

答えて

4

注意。 Totalは組み込み関数であるため、これは、

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 

しかし、この特定のケースでは、スピードアップがその巨大ではありません。 SortByが導入された全理由は、効率性(つまり、単一の比較関数であり、いくつかの比較関数については、タイブレーカーとしても便利です)です。 Sortがより具体的であるため、主評価手順ではより多くのステップをバイパスするので、より効率的です。しかし、SortByは、並べ替えの基になる関数の可能なリストアビリティ(ベクトル化された性質)を活用する方法がなく、リスト要素に1つずつ適用されます。順序付きの解法は、ソート関数の全面的な計算の可能性を明示的に活用します(この場合、Total[#,{2}]&はこれを行います)。したがって、より高速です。

、我々は、より大きなパフォーマンスの違いを参照したい場合には、例えば、タスクは、各サブリストにおける第2、第3および第4要素の合計に応じてソートすることであろう。一般的に、

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の大きなリストではn*Log[n]に比例するソートの本質的な複雑さのためであり、この複雑さは常に存在します。

+0

クールなヒント。ありがとう。 :) –

8

リスト内のリストを並べ替えることのできる範囲については、ドキュメントのSortByを参照してください。

SortBy[A,Total] 

が必要です。

EDIT:パー氏ウィザードの以下のコメントと、その中のリンクで説明、

SortBy[A,{Total}] 

が優れています。

+0

@Mr Wizardは、先日別の並べ替えの問題についてコメントしました。これは、SortBy [A、{Total}] 'が少し速くなっているようです。 –

+0

@ありがとうございます。とても興味深い;それはヴィンテージMr.Wizard発見のように聞こえる。質問やリンクを覚えていますか? – kglr

+0

最後の3〜4日間であって、分類に関連する質問以外はお手数ではありません。私はそれを探します。 –

0

次は動作するはずです(私は今それをテストすることはできません):それは私たちがベクトル化を活用することができますので、多くの場合、Orderingに基づいてソートすると、SortByより速くできること

Sort[A, Total[#1]<Total[#2]&] 
関連する問題