2014-10-28 2 views
0

У меня были проблемы со скоростью при попытке использовать модуль 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 или многопроцессорная работа могут помочь, но я не понял, как это сделать.

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

ответ

2

Мне было любопытно узнать, сколько можно увеличить производительность, поэтому была написана новая функция для 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 не освобождает Global Interpreter Lock (GIL), поэтому заправка не поможет.

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

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

+0

Благодарим вас за ответ @casevh. Я полагаю, что gmpy2.vector (a) - это новая функция? Действительно, это не похоже на большую скорость. Что касается многопроцессорной обработки, я пытался использовать структуру IPipon http://ipython.org/ipython-doc/stable/parallel/parallel_multiengine.html#quick-and-easy-parallelism. Это должно работать правильно? – evan54

+0

Да, vector() - это имя тестовой функции. Я был разочарован отсутствием ускорения. Извините, но я не знаком с параллельными инструментами IPython. – casevh

+0

Без проблем спасибо вам большое. По крайней мере, я знаю, что мне не стоит пытаться использовать какой-то JIT! – evan54

 Смежные вопросы

  • Нет связанных вопросов^_^