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

Bill Allombert <[email protected]> Sat, 25 Apr 2026 14:30:10 +0200
Newsgroups gmane.comp.mathematics.pari.user
Message-ID <aeyz0hVJj_G9oOrp@seventeen>
On Sat, Apr 25, 2026 at 01:52:46PM +0200, Ruud H.G. van Tol wrote:
> 
> 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.

This is faster because mapget only fail 100 out of 10^5 that is 0.1% of the time.

In fact you could do

{
  my(nn=10^5,w=100,m=Map());
  for(j=0,99,mapput(~m,j,[]));
  for(i=1,nn,
    my(k=random(w));
    mapput(~m,k,concat(mapget(m,k),i))
  );#m;
}
to avoid the iferr.

but the real slowdown is due to concat, you should use lists and mappapply:

{
  my(nn=10^5,w=100,m=Map());
  for(i=1,nn,
    my(k=random(w));
    mapapply(~m,k,(~y)->listput(~y,i),()->List(i))
  );m;
}

(about 10 time faster)

Cheers,
Bill