Я хотел бы улучшить производительность свертки с помощью 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.
Спасибо!
EDIT:
Ускорьтесь примерно на 10 раз, перезаписав цикл питона в C с помощью Numpy.