|
|
1
16
我对Mathematica的理解是,它是一个巨大的搜索替代引擎。所有函数、变量和其他赋值本质上都存储为规则,在求值期间,Mathematica将遍历这个全局规则库并应用它们,直到结果表达式停止更改。
因此,你浏览规则列表的次数越少,评估的速度就越快。看看使用
很清楚为什么匿名函数最快,为什么要使用
我有时会建造一个
|
|
|
2
13
不是真的。Mathematica是一个术语重写器,Lisp宏也是。
对。注意,在Mathematica中,您从来没有真正“执行函数”。您只是应用重写规则将一个表达式更改为另一个表达式。
考虑映射
我们可以定义一个全局重写规则,其中包含
请注意,这比以前的解决方案慢约100倍。
或者,我们可以定义一个替换符号的全局重写规则
请注意,这比以前的解决方案快约10倍。
为什么?因为第二个缓慢的解决方案是查找重写规则
如果是,为什么
其他人描述过相似功能之间的性能差异要小得多。我相信这些情况下的性能差异只是Mathematica内部的精确实现中的微小差异。Mathematica最大的问题是全局重写表。特别是,这是Mathematica与传统术语级解释器的不同之处。 通过编写mini Mathematica实现,您可以了解Mathematica的许多性能。在这种情况下,可以将上述解决方案编译为(例如)F#。数组的创建方式如下:
内置的
这需要6毫秒就像
在Mathematica的全局重写表中查找重写规则类似于在键入函数名的字典中查找闭包。这样的字典在F#中可以这样构造:
这与
然后程序变为:
注意,由于内部循环中的哈希表查找,我们的性能降低了10倍。
另一种方法是存储
我们甚至可以用几行代码编写一个完整的术语重写器。术语可以表示为以下类型的值:
请注意
以下
以下
注意这个函数的类型
我们的程序现在可以由我们的自定义术语重写器定义和执行:
我们已经恢复了
我们甚至可以恢复
我写了一篇关于 term rewriting in F# . |
|
|
3
6
一些测量根据@gdelfino的回答和@rcollyer的评论,我制作了这个小程序:
结果,至少对我来说,非常令人惊讶:
有什么解释吗?请随意编辑此答案(对于长文本,注释是混乱的) 编辑 使用标识函数f[x]=x进行测试,以将解析与实际计算隔离开来。结果(相同颜色):
注:对于常数函数(f[x]:=1),结果与此图非常相似; |
|
|
4
4
模式匹配似乎更快:
模式匹配也更灵活,因为它允许您重载定义:
对于简单的函数,可以编译以获得最佳性能:
|
|
|
5
3
您可以使用前面的函数recordSteps answer 看看Mathematica对函数到底做了什么。它对待它就像对待其他人一样。也就是说,假设你有
它首先将f[2]转换为
下一步,
您可以将Mathematica中的所有内容都看作一个表达式,其中求值是在 predefined sequence ,这适用于类似于任何其他头部的功能 |
|
|
Stephen · 在emacs中评估Lisp的正确方法是什么 1 年前 |
|
|
lightning_missile · 词法范围和共享对象 8 年前 |
|
|
Alexandru Popa · SBCL中奇怪的宏扩展错误 8 年前 |
|
|
Jacky · 编辑列表中的每个偶数索引元素 8 年前 |
|
|
HappyFace · lisp典型缩进约定背后的规则是什么? 8 年前 |