Как мне ускорить работу с массивом gmpy?

У меня были проблемы со скоростью при попытке использовать модуль gmpy.

import numpy as np
import gmpy2 as gm
N = 1000
a = range(N)
%timeit [gm.sin(x) for x in a]
# 100 loops, best of 3: 7.39 ms per loop
%timeit np.sin(a)
# 10000 loops, best of 3: 198 us per loop

Мне было интересно, смогу ли я как-нибудь ускорить это вычисление. Я думал, что JIT или многопроцессорная обработка могут помочь, но я не понял, как это сделать.

Любая помощь будет принята с благодарностью. Если вы хотите, чтобы я опубликовал дополнительную информацию, пожалуйста, дайте мне знать.

1 ответ

Решение

Мне было любопытно посмотреть, насколько возможно увеличение производительности, поэтому написал новую функцию для gmpy2 что рассчитал sin списка полностью на C. К сожалению, не было большого улучшения.

%timeit [gmpy2.sin(x) for x in a]
100 loops, best of 3: 4.85 ms per loop
%timeit map(gmpy2.sin, a)
100 loops, best of 3: 4.59 ms per loop
%timeit gmpy2.vector(a)
100 loops, best of 3: 4.44 ms per loop

gmpy2 не освобождает глобальную блокировку интерпретатора (GIL), поэтому многопоточность не поможет.

Многопроцессорная обработка может помочь, но вам, вероятно, потребуется распараллелить части кода, выполнение которых занимает секунды (или дольше), чтобы преодолеть издержки, связанные с передачей данных другому процессу.

Программная, с плавающей точкой произвольной точности, просто медленнее, чем собственная плавающая точка.

Другие вопросы по тегам