Mathematicaでは、すべてのマシンサイズの整数または浮動小数点数を含むベクトル(または長方形の配列)をパックされた配列に格納できます。これらのオブジェクトはメモリをあまり消費せず、一部の操作ははるかに高速です。
RandomReal
可能な場合はパック配列を生成します。Developer
パックされた配列は、関数を使用してアンパックできますFromPackedArray
これらのタイミングを考慮してください
lst = RandomReal[1, 5000000];
Total[lst] // Timing
Plus @@ lst // Timing
lst = Developer`FromPackedArray[lst];
Total[lst] // Timing
Plus @@ lst // Timing
Out[1]= {0.016, 2.50056*10^6}
Out[2]= {0.859, 2.50056*10^6}
Out[3]= {0.625, 2.50056*10^6}
Out[4]= {0.64, 2.50056*10^6}
したがって、パックドアレイの場合は、非パックドアレイの場合Total
よりも何倍も高速ですPlus @@
が、ほぼ同じです。Plus @@
パックされた配列では実際には少し遅いことに注意してください。
今考えてみましょう
lst = RandomReal[100, 5000000];
Times @@ lst // Timing
lst = Developer`FromPackedArray[lst];
Times @@ lst // Timing
Out[1]= {0.875, 5.8324791357*10^7828854}
Out[1]= {0.625, 5.8324791357*10^7828854}
最後に、私の質問です。Mathematicaには、パックされた配列のリスト積に対して、類似した高速な方法がありTotal
ますか?
数値誤差が乗算と複合する方法のために、これは不可能かもしれないと私は思う。また、この関数は、マシン以外のフロートを返すことができる必要があります。