gpt4 book ai didi

wolfram-mathematica - 在具有保留参数的函数中键入检查符号的快速方法

转载 作者:行者123 更新时间:2023-12-04 10:21:12 25 4
gpt4 key购买 nike

可以使用以下方法测试参数是否是没有显式值的符号:

func[s_Symbol] = ...

但是,如果函数具有 Hold 属性,则该模式将匹配所有符号,而不仅仅是那些没有显式值的符号。我可以使用:
func[s_] /; Head[s] === Symbol = ...

但这会带来比我想要的更大的性能损失。为 _Symbol 添加规则对性能的影响很小, HoldFirst似乎没有任何性能损失,但是 Head[s] === Symbol在一个简单的函数上有很大的开销。使用 ValueQ 进行测试和 MatchQ[s, _Symbol]甚至更慢。

澄清一下,我想对 func 有两个不同的定义。 ,一个用于未分配的符号,一个用于其他参数。

有更快的方法吗?

时间:
f[x_] = 0;

f /@ Range@1*^6; // Timing

f[s_Symbol] = 1;

f /@ Range@1*^6; // Timing
   {0.391, Null}
   {0.531, Null}
Remove[f]
SetAttributes[f, HoldFirst]

f[x_] = 0;

f /@ Range@1*^6; // Timing

f[s_] /; Head[s] === Symbol = 1;

f /@ Range@1*^6; // Timing

{0.39,空}

{1.157,空}

最佳答案

通过将持有的符号参数委托(delegate)给非持有的辅助函数 g,您可以获得与展示的最快运行时间相当的性能。 :

Remove[f, g]
SetAttributes[f, HoldFirst]
f[_] = 0;
f[s_Symbol] := g[s]
g[_Symbol] = 1;
g[_] = 0;

关于wolfram-mathematica - 在具有保留参数的函数中键入检查符号的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848128/

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