Il modo più veloce per verificare se l'array è zero

Oct 13 2020

Qual è il modo più veloce per verificare se un intero array è zero? Nel mio caso gli elementi dell'array sono 1 o 0, ma a scopo di riferimento può essere considerato anche il caso generale.

Risposte

7 HenrikSchumacher Oct 13 2020 at 20:51

LinearAlgebra`Private`ZeroArrayQsembra fare un buon lavoro. Curiosamente, Statistics`Library`ConstantVectorQ[#] && #[[1]] == 0 &tende ad essere un po 'più veloce sulla mia macchina.

1 AccidentalTaylorExpansion Oct 14 2020 at 18:44

Ho testato i metodi da Henrik e ho ottenuto i seguenti tempi

linAlgZeroArrayQ = LinearAlgebra`Private`ZeroArrayQ;
statZeroArrayQ = 
  Statistics`Library`ConstantVectorQ[#] && #[[1]] == 0 &;
totalZeroArrayQ = Total[#] == 0 &;

n = 10^5;
exactZeros = ConstantArray[0, n];
numericalZeros = ConstantArray[0., n];
exactSparse = exactZeros; exactSparse[[n/2]] = 1;
numericalSparse = numericalZeros; numericalSparse[[n/2]] = 1.;
exactRandom = RandomChoice[{0, 1}, n];
numericalRandom = RandomChoice[{0., 1.}, n];

functions = {linAlgZeroArrayQ, statZeroArrayQ, totalZeroArrayQ};
tests = {exactZeros, numericalZeros, exactSparse, numericalSparse, 
   exactRandom, numericalRandom};
results = Table[
   AbsoluteTiming[Do[functions[[j]]@tests[[i]], {10000}]][[1]], {i, 1,
     Length@tests}, {j, 1, Length@functions}
   ];

TableForm[results, 
 TableHeadings -> {{"Exact zeros", "Numerical zeros", "Exact sparse", 
    "Numerical sparse", "Exact random", 
    "Numerical random"}, {"Linear Algebra method", 
    "Statistics method", "Total"}}]

Per i casi che ho testato, LinearAlgebra`Private`ZeroArrayQsembra un chiaro vincitore, ma potrebbero esserci casi / macchine in cui Statistics`Library`ConstantVectorQ[#] && #[[1]] == 0 &vince.