Ruud H.G. van Tol on Sat, 25 Apr 2026 13:52:54 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

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



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