PackedArrays 有快速的产品操作吗?

2024-01-12

在 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}

因此,在压缩数组的情况下,TotalPlus @@但对于非压缩数组来说大致相同。注意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?

我怀疑这可能是不可能的,因为数值误差与乘法相结合。此外,该函数需要能够返回非机器浮点数才能发挥作用。


我也想知道是否有一个乘法相当于Total.

A really not so bad solution is

In[1]:= lst=RandomReal[2,5000000];
        Times@@lst//Timing
        Exp[Total[Log[lst]]]//Timing
Out[2]= {2.54,4.370467929041*10^-666614}
Out[3]= {0.47,4.370467940*10^-666614}

只要数字是正数并且不太大或太小, 那么舍入误差并不算太糟糕。 对评估过程中可能发生的情况的猜测是:(1)如果数字是正浮点数,则Log操作可以快速应用于打包数组。 (2) 然后可以使用以下命令快速添加数字Total的压缩数组方法。 (3) 那么这只是最后一步,需要出现非机器尺寸的浮子。

See 这个答案 https://stackoverflow.com/questions/5294640/is-there-a-fast-product-operation-for-packedarrays/5308395#5308395适用于正浮点数和负浮点数的解决方案。

让我们快速检查一下该解决方案是否适用于产生非机器大小答案的浮点数。与安德鲁相比(快得多)compiledListProduct:

In[10]:= compiledListProduct = 
          Compile[{{l, _Real, 1}}, 
           Module[{tot = 1.}, Do[tot *= x, {x, l}]; tot], 
           CompilationTarget -> "C"]

In[11]:= lst=RandomReal[{0.05,.10},15000000];
         Times@@lst//Timing
         Exp[Total[Log[lst]]]//Timing
         compiledListProduct[lst]//Timing
Out[12]= {7.49,2.49105025389*10^-16998863}
Out[13]= {0.5,2.4910349*10^-16998863}
Out[14]= {0.07,0.}

如果您选择较大的(>1) 实数,那么compiledListProduct会产生警告CompiledFunction::cfne: Numerical error encountered; proceeding with uncompiled evaluation.并且需要一些时间才能给出结果......


一个好奇的是,两者Sum and Product可以采用任意列表。Sum工作正常

In[4]:= lst=RandomReal[2,5000000];
         Sum[i,{i,lst}]//Timing
         Total[lst]//Timing
Out[5]= {0.58,5.00039*10^6}
Out[6]= {0.02,5.00039*10^6}

但很长一段时间PackedArrays,例如这里的测试示例,Product失败,因为自动编译的代码(在版本 8.0 中)无法正确捕获下溢/溢出:

In[7]:= lst=RandomReal[2,5000000];
         Product[i,{i,lst}]//Timing
         Times@@lst//Timing
Out[8]= {0.,Compile`AutoVar12!}
Out[9]= {2.52,1.781498881673*10^-666005}

WRI 技术支持提供的解决方法是使用以下命令关闭产品编译SetSystemOptions["CompileOptions" -> {"ProductCompileLength" -> Infinity}]。另一种选择是使用lst=Developer`FromPackedArray[lst].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PackedArrays 有快速的产品操作吗? 的相关文章

  • Python 检查列表是否嵌套

    我有一个列表 有时它是嵌套的 有时不是 根据是否嵌套 延续不同 如何检查此列表是否嵌套 True or False应该输出 example 1 2 3 gt False 1 2 3 gt True 您可以使用isinstance https
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 找出对象列表中是否包含具有指定字段值的内容?

    我有一个从数据库收到的 DTO 列表 它们有一个 ID 我想确保我的列表包含具有指定 ID 的对象 显然 在这种情况下创建具有预期字段的对象不会有帮助 因为 contains 调用 Object equals 并且它们不会相等 我想出了这样
  • 当列表中不存在 X 时,从列表中查找大于 X 的值

    我试图从列表中查找大于特定值 在我的情况下已知 的值 Example Given list 1 2 5 10 15 list is sorted 查找大于的值X 7在这种情况下 期望的结果 返回一个包含值的列表 10 15 我尝试使用jav
  • 角度分割列表

    我有一个看起来像这样的列表 A B C 是否有任何简单的方法 而无需创建一个函数 将其展平为一个看起来像这样的数组 A B C 我搜索了 SO 但没有找到任何带有打字稿方法的内容 Thanks 编辑 A B C 是相同类型 看来您正在寻找的
  • Dart 中的 DoubleLinkedQueue 和 ListQueue 有什么区别?

    Dart 核心 API 有两个类实现Queue
  • 如何将嵌套的数字列表转换为字符串列表?

    我有下面的列表 p 1 2 3 4 2 3 4 1 如何将子列表放入字符串中 例如 期望的结果是 p 1234 2341 可以通过将每个整数转换为字符串并连接字符串来完成 p join map str sub list for sub li
  • 在 Mathematica 中创建可变长度的空格字符串

    以下 Mathematica 函数 f 创建长度为 n 的空白字符串 f n Fold StringJoin Array n 必须有无数种替代方案来创建此功能 你会怎么做呢 f n StringJoin ConstantArray n Ed
  • 我应该如何在序言中设计这个谓词?

    我必须写一个谓词stepup L Z X where L是一个列表并且Z and X是整数 它应该返回true if the Z可以步入X使用列表中用户给出的合法步骤 例如 stepup 7 12 19 6 32 应该返回true sinc
  • python 中的扁平化列表

    我看过很多关于如何在 Python 中展平列表的帖子 但我一直无法理解这是如何运作的 reduce lambda x y x y myList 有人可以解释一下这是如何工作的吗 gt gt gt myList 1 2 3 4 5 6 7 8
  • 如何使带有两个for循环的python代码运行得更快(有没有一种python方法可以进行Mathematica的并行化)?

    我对 python 或任何此类编程语言完全陌生 我对 Mathematica 有一些经验 我有一个数学问题 虽然 Mathematica 用她自己的 并行化 方法解决了这个问题 但在使用所有核心后 系统却变得非常疲惫 在跑步过程中我几乎无法
  • 在 python 中高效、快速地迭代元组列表中超过 3600 万个项目

    首先 在任何人将其标记为重复之前 请阅读以下内容 我不确定迭代的延迟是否是由于尺寸巨大或我的逻辑造成的 我有一个必须迭代的用例3600 万件商品在元组列表中 我的主要要求是速度和效率 样本清单 how are you I am fine h
  • 列表子类的 Python 类型

    我希望能够定义列表子类的内容必须是什么 该类如下所示 class A list def init self list init self 我想包括打字 这样就会发生以下情况 import typing class A list typing
  • 在Python中将字符串转换为字典或列表?

    在Python中将此字符串转换为列表或字典 u f i r s t n a m e u j o h n u l a s t n a m e u s m i t h u a g e 2 0 u m o b
  • 按属性对对象列表进行排序 C#

    我有这门课 public class Leg public int Day get set public int Hour get set public int Min get set 我有一个获取腿列表的函数 称为 GetLegs Lis
  • 使用任意索引进行 Python 列表切片

    有没有更好的方法从 python 中的列表中提取任意索引 我目前使用的方法是 a range 100 s a i for i in 5 13 25 其中a是我想要切片的数组 5 13 25 是我想要获取的元素 它看起来比 Matlab 的等
  • 循环列表的值[重复]

    这个问题在这里已经有答案了 我是编码新手 正在尝试编写一个简单的代码 该代码将采用一个列表 例如 1 2 3 并循环元素 n 次 所以如果n 1 我应该得到A 3 1 2 如果n 2 我应该得到A 2 3 1 我写的代码是 n 1 j 0
  • 将嵌套列表转换为嵌套列表

    我知道可以将项目列表从一种类型转换为另一种类型 但是如何将嵌套列表转换为嵌套 List 已经尝试过的解决方案 List
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt

随机推荐