检查列表是否包含零的最快方法

时间:2011-12-24 02:37:15

标签: performance wolfram-mathematica mathematica-7

在准备Secret Santa - Generating 'valid' permutations的答案时,我发现需要检查列表是否包含零。我想知道在 Mathematica 7 中最快的方法是什么,重点是非负整数的简短列表。

使用Min[list] === 0是我发现的最快,比MemberQFreeQ更快,但我希望有更快的方法,与BitXor操作相同下面:

r = Range@9;
p = Permutations@r;

BitXor[r, #] & /@ p; // Timing
0 === Min[BitXor[r, #]] & /@ p; // Timing
{0.062, Null}
{0.452, Null}

1 个答案:

答案 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}