作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在问为什么PatternTest
导致了大量不必要的评估:PatternTest not optimized?列昂尼德回答说,在我看来,这是一种相当有问题的方法,这是必要的。我可以接受这一点,尽管我更喜欢更有效的替代方案。
我现在意识到,我相信 Leonid 已经说过一段时间了,这个问题在 Mathematica 中存在得更深,我很困扰。我不明白为什么这不是或不能更好地优化。
考虑这个例子:
list = RandomReal[9, 20000];
Head /@ list; // Timing
MatchQ[list, {x__Integer, y__}] // Timing
PatternTest
的情况不同。我看不出模式中有任何可变性。对此有何解释?
最佳答案
MatchQ
为这些类型的测试解包。原因是没有为此实现任何特殊情况。原则上它可以包含任何东西。
On["Packing"]
MatchQ[list, {x_Integer, y__}] // Timing
MatchQ[list, {x__Integer, y__}] // Timing
MatchQ[list, {x__Integer, y__}]
部分代码转到算法的另一部分(需要解压缩列表)。其他一些注意事项:只有当两种模式都是
__
时才会出现这种复杂性。如果其中之一是
_
该算法具有更好的复杂度。
MatchQ[list, {Shortest[x__Integer], __}]
和 friend 但无济于事。
DeveloperPackedArrayQ[expr] && Head[expr[[1]]]===Integer
或一些这样的。
关于performance - Mathematica 的模式匹配优化不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522876/
我是一名优秀的程序员,十分优秀!