(Примечание: я помогаю поддерживать GMPY, и я реализовал довольно много оптимизаций в последнем выпуске.)
GMPY v1.11 использует mpz_add_ui
при добавлении небольшого числа в mpz. Новейшая версия GMPY также работает примерно на 25% быстрее, чем предыдущие версии при работе с небольшими номерами.
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
Поскольку конвертировать Python int в long быстрее и вызывать mpz_add_ui
быстрее, чем конвертировать Python int в mpz, преимущество в производительности незначительно. Я не удивлюсь, если будет 10-кратное снижение производительности при вызове функций GMP по сравнению с нативными операциями в течение длительного времени.
Можете ли вы накопить несколько маленьких чисел в один длинный и добавить их одновременно к своему большому числу?