(Nota:. Io aiuto mantenere GMPY e ho implementato un bel paio di ottimizzazioni nella versione più recente)
GMPY v1.11 fa uso mpz_add_ui
quando si aggiunge un piccolo numero a un MPZ. Anche la versione più recente di GMPY è circa il 25% più veloce rispetto alle versioni precedenti quando si lavora con numeri piccoli.
With GMPY 1.04
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.18 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.153 usec per loop
With GMPY 1.11
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000)" "a+1"
10000000 loops, best of 3: 0.127 usec per loop
$ py26 -mtimeit -s "import gmpy;a=gmpy.mpz(10**1000);b=gmpy.mpz(1)" "a+b"
10000000 loops, best of 3: 0.148 usec per loop
Poiché è più veloce per convertire un int Python per un lungo e chiamare mpz_add_ui
di convertire un int Python per un mpz, v'è un vantaggio prestazioni moderate. Non sarei sorpreso se c'è una penalità di prestazioni 10 volte per chiamare le funzioni GMP rispetto alle operazioni native su un lungo lungo.
Puoi accumulare molti dei piccoli numeri in uno lungo e aggiungerli contemporaneamente al tuo numero elevato?
Interessante. Sto usando l'overloading C++ delle operazioni aritmetiche, forse anche questi binding C++ non stanno utilizzando questo metodo veloce. Farò dei test domani. Grazie! – sligocki