Mathematica 的模式匹配优化不佳?

2024-04-25

我最近询问了为什么PatternTest引起了大量不必要的评估:PatternTest 未优化? https://stackoverflow.com/questions/8484299/patterntest-not-optimized列昂尼德回答说,对于我看来相当值得怀疑的方法来说,这是必要的。我可以接受这一点,尽管我更喜欢更有效的替代方案。

我现在意识到,我相信列昂尼德已经说过一段时间了,这个问题在更深层次上数学,我很烦恼。我不明白为什么这没有或不能更好地优化。

考虑这个例子:

list = RandomReal[9, 20000];
Head /@ list; // Timing
MatchQ[list, {x__Integer, y__}] // Timing

{0., Null}  

{1.014, False}  

检查列表的头部基本上是瞬时的,但检查模式需要一秒钟以上的时间。一定数学可以认识到,由于列表的第一个元素不是整数,因此模式无法匹配,这与以下情况不同PatternTest我看不出模式中有任何可变性。对此有何解释?


There appears to be some confusion regarding packed arrays, which as far as I can tell have no bearing on this question. Rather, I am concerned with the O(n2) time complexity on all lists, packed or unpacked.


MatchQ解压这些类型的测试。原因是没有实施这种特殊情况。原则上它could包含任何东西。

On["Packing"]
MatchQ[list, {x_Integer, y__}] // Timing

MatchQ[list, {x__Integer, y__}] // Timing

改进这一点非常棘手 - 如果你破坏了模式匹配器,你就会遇到严重的问题。

Edit 1:确实,拆包并不是 O(n^2) 复杂度的原因。然而,它确实表明对于MatchQ[list, {x__Integer, y__}]代码的一部分转到算法的另一部分(需要解包列表)。其他一些需要注意的事情:只有当两种模式都存在时,这种复杂性才会出现__如果其中任何一个是_算法具有较好的复杂度。

然后该算法会遍历所有 n*n 个潜在匹配,并且似乎没有早期救助。大概是因为可以构造需要这种复杂性的其他模式 - 问题是上述模式迫使匹配器采用非常通用的算法。

那时我希望MatchQ[list, {Shortest[x__Integer], __}]和朋友,但都无济于事。

所以,我的两分钱:要么使用不同的模式(并使用 On["Packing"] 来查看它是否进入通用匹配器),要么进行预检查DeveloperPackedArrayQ[expr] && Head[expr[[1]]]===Integer或一些这样的。

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

Mathematica 的模式匹配优化不佳? 的相关文章

  • 真实文件对象比 StringIO 和 cStringIO 慢?

    StringIO其代码中有以下注释 Notes Using a real file is often faster but less convenient There s also a much faster implementation
  • Postgres 服务器性能在达到一定数量的记录后急剧下降

    我正在使用游标从大型 postgres 表中检索记录 4亿条记录 使用子表对数据进行分区 我的游标定义为 select from parent table order by indexed column 同时使用 JDBC 和 psql 前
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • Mathematica 中 PatternTest 的意外行为

    我正在研究玩具问题 以帮助我吸收 Mathematica 中模式匹配的思想 下面的代码没有按照我的预期运行 我无法弄清楚我对 PatternTest 的理解有什么问题 MatchQ 2 1 2 5 x FromDigits gt 3 y 我
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 更改为通用接口对性能的影响

    我使用 Visual Studio 使用 C NET 开发应用程序 ReSharper 在我的方法原型中经常建议我用更通用的类型替换输入参数的类型 例如 如果我仅在方法主体中使用带有 foreach 的列表 则使用 List 和 IEnum
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 如何防止Googlebot淹没网站?

    我正在中间的专用服务器上运行一个内容很多但流量很少的网站 有时 Googlebot 会踩踏我们 导致 Apache 耗尽内存 导致服务器崩溃 我怎样才能避免这种情况 在谷歌网站管理员工具上注册 验证您的网站并限制谷歌机器人 提交站点地图 阅
  • 您可以从 MethodInfo 对象获取 Func (或类似的)吗?

    我意识到 一般来说 使用反射会对性能产生影响 实际上 我本人根本不喜欢反思 这纯粹是学术问题 假设存在一些如下所示的类 public class MyClass public string GetName return My Name 请耐
  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • 我们可以使用什么方法来重塑非常大的数据集?

    当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时 事先知道要使用哪种重塑方法是很有价值的 Lately methods for reshaping data have been further developed regar
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • .NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效的实现

    考虑到入队和出队操作的速度同样重要 NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效 就速度而言 的实现是什么 UniqueQueue是一个不可能出现重复的队列 因此 如果我将一个元素推送到队
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • Mathematica 执行时错误:符号名称

    Mathematica 中存在一个奇怪的 bug 多年 至少从 5 1 版开始 一直持续到 7 版 Module f L L f Do L f L i i 10 4 Timing 0 015 Null Module weirdness L
  • 优化我的表现

    我正在开发一个使用 Zend Framework 1 11 Doctrine 2 一些 Symfony 2 组件以及其他工具和库的项目 我正在尝试使用 Xdebug 和 Webgrind 优化性能 我已经发现了一些瓶颈 例如解析 Ini 配

随机推荐