mapisdefined(m,k,&v) vs. iferr(mapget(m,k),E,)

"Ruud H.G. van Tol" <[email protected]> Sat, 25 Apr 2026 13:52:46 +0200
Newsgroups gmane.comp.mathematics.pari.user
Message-ID <[email protected]>
v=0; mapisdefined(m, k, &v); mapput(~m, k, v+1)
   vs.
mapput(~m, k, iferr( mapget(m, k), E, 0)+1)


I recently changed some code to use the iferr() variant, to make it run 
significantly faster.
Yes, there was a stupid tight loop involved.


Random test:

? {
   my(nn=10^5, w=100, m=Map());
   for(i=1, nn
   , my(k=random(w), v=[]);
     mapisdefined(m, k, &v);
     mapput(~m, k, concat(v, i))
   );
   #m
}
cpu time = 1,256 ms, real time = 1,260 ms.
% 100

? {
   my(nn=10^5, w=100, m=Map());
   for(i=1, nn
   , my(k=random(w));
     mapput(~m, k, concat(iferr(mapget(m,k),E,[]), i))
   );
   #m
}
cpu time = 871 ms, real time = 891 ms.
% 100



Maybe mapget() can grow a variant, with an extra parameter for an 
expression to return in cases where the key doesn't exist.

   mapput( ~m, k, concat( mapgetX(m, k, []), i) )

-- Ruud