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