Я хотел бы улучшить производительность свертки с использованием Python и надеялся получить представление о том, как лучше всего повысить производительность.
В настоящее время я использую scipy для выполнения свертки, используя код, подобный приведенному ниже фрагменту:
import numpy
import scipy
import scipy.signal
import timeit
a=numpy.array ( [ range(1000000) ] )
a.reshape(1000,1000)
filt=numpy.array( [ [ 1, 1, 1 ], [1, -8, 1], [1,1,1] ] )
def convolve():
global a, filt
scipy.signal.convolve2d ( a, filt, mode="same" )
t=timeit.Timer("convolve()", "from __main__ import convolve")
print "%.2f sec/pass" % (10 * t.timeit(number=10)/100)
Я обрабатываю данные изображения, используя оттенки серого (целочисленные значения от 0 до 255), и в настоящее время я получаю около четверти секунды на свертку. Я думал сделать одно из следующего:
Используйте corepy, желательно с некоторыми оптимизациями
Перекомпилируйте numpy с помощью icc & ikml.
Используйте python-cuda.
Мне было интересно, имел ли кто-нибудь опыт работы с любым из этих подходов (какой тип выигрыша будет типичным и стоит ли это времени) или кто-нибудь знает о лучшей библиотеке для выполнения свертки с Numpy. 1010 *
Спасибо!
РЕДАКТИРОВАТЬ:
Ускорьте примерно в 10 раз, переписав цикл Python на C, используя Numpy.