在准备Secret Santa - Generating 'valid' permutations的答案时,我发现需要检查列表是否包含零。我想知道在 Mathematica 7 中最快的方法是什么,重点是非负整数的简短列表。
使用Min[list] === 0
是我发现的最快,比MemberQ
或FreeQ
更快,但我希望有更快的方法,与BitXor
操作相同下面:
r = Range@9;
p = Permutations@r;
BitXor[r, #] & /@ p; // Timing
0 === Min[BitXor[r, #]] & /@ p; // Timing
{0.062, Null}
{0.452, Null}
答案 0 :(得分:2)
问题中使用0 === Min
的部分减速效果似乎是干扰了Map
的自动编译。分离这些步骤提供了近两倍的改进:
r = Range@9;
p = Permutations@r;
Min@# === 0 & /@ (BitXor[r, #] & /@ p); // Timing
{0.296, Null}
如果我接受结果为(0 | 1)并且如果我将列表作为一个处理,那么我可以使用它:
Unitize[Times @@ BitXor[r, #] & /@ p]; // Timing
{0.156, Null}