在具有保留参数的函数中键入check Symbol的快速方法
|
可以使用以下方法测试参数是否为没有显式值的Symbol:
func[s_Symbol] = ...
但是,如果函数具有Hold属性,则该模式将匹配所有Symbols,不仅是那些没有显式值的Symbols。我可以使用:
func[s_] /; Head[s] === Symbol = ...
但这会带来比我想要的更大的性能损失。为_Symbol
添加一条规则对性能的影响很小,而appear3ѭ似乎没有任何性能损失,但是Head[s] === Symbol
在简单函数上有相当大的开销。 ѭ5和ѭ6的测试甚至更慢。
为了明确起见,我想为func
提供两个不同的定义,其中一个用于未分配的符号,另一个用于其他自变量。
有没有更快的方法?
时间:
f[x_] = 0;
f /@ Range@1*^6; // Timing
f[s_Symbol] = 1;
f /@ Range@1*^6; // Timing
{0.391,空}
{0.531,空}
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,空}
没有找到相关结果
已邀请:
3 个回复
响摔衅幸
属性的代码中使用模式
将改善性能:
薄扩络拜
,可以获得与最快的运行时间相当的性能:
苛肠倒俱
为了进行比较,这是您使用的一种:
现在:
当您的参数主要是非符号时,这将更有效,并且之所以更快,是因为您仍然可以使用
模式将其过滤掉。仅对于符号列表,它实际上可能会更慢: