在 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
?
我怀疑这可能是不可能的,因为数字错误与乘法复合的方式。此外,该函数需要能够返回非机器浮点数才能有用。