在准备对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,空}

{0.452,空}

最佳答案

似乎问题中使用0 === Min的速度下降的部分原因是干扰了Map的自动编译。分离这些步骤可提供将近两倍的改进:

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

Min@# === 0 & /@ (BitXor[r, #] & /@ p); // Timing


{0.296, Null}

If I accept a result as (0|1) and if I process the list as one then I can use this:

Unitize[Times @@ BitXor[r, #] & /@ p]; // Timing


{0.156,空}

关于performance - 检查列表是否包含零的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8622317/

10-11 06:36