gpt4 book ai didi

wolfram-mathematica - 为什么 Mathematica 代码中的纯函数速度更快?

转载 作者:行者123 更新时间:2023-12-04 07:58:34 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




10年前关闭。




Possible Duplicate:
Performance difference between functions and pattern matching in Mathematica



我经常在这里发布的许多答案中发现大量使用纯函数,并且这些解决方案通常比使用命名模式等快得多。为什么会这样?为什么纯函数比其他函数快?这是否与 mma 解释器必须做更少的工作有关?

最佳答案

首先,让我们考虑一些示例基准:

In[100]:= f[x_]:=x^2;

In[102]:= Do[#^2&[i],{i,300000}]//Timing
Out[102]= {0.406,Null}

In[103]:= Do[f[i],{i,300000}]//Timing
Out[103]= {0.484,Null}

In[104]:= Do[Function[x,x^2][i],{i,300000}]//Timing
Out[104]= {0.578,Null}

纯函数通常(快得多)有两个原因。首先,匿名纯函数(用槽定义的函数 - #& )不需要解决变量名称的名称冲突。因此,它们比模式定义的要快一些,模式定义的会发生一些名称冲突。但是你会看到带有命名变量的纯函数实际上比模式定义的函数更慢,而不是更快。我可以推测这是因为他们也必须解决他们 body 内部可能发生的冲突,而基于规则的人会忽略此类冲突。在任何情况下,速度差异都在 10-20% 的数量级。

另一个更显着的区别是它们用于 Map、Scan、Table 等函数时,因为后者在大型数字(压缩)列表上自动编译。但是,尽管通常可以编译纯函数,但模式定义的函数基本上不能编译,因此它们无法获得这种速度增益。例如:
In[117]:= ff[x_] := Sqrt[x];

In[116]:= Map[Sqrt[#] &, N@Range[100000]]; // Timing

Out[116]= {0.015, Null}

In[114]:= Map[ff, N@Range[100000]]; // Timing

Out[114]= {0.094, Null}

关于wolfram-mathematica - 为什么 Mathematica 代码中的纯函数速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333450/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com