Я хотел бы улучшить производительность свертки с помощью python и надеялся на некоторое понимание того, как лучше всего улучшить производительность.Улучшение производительности Numpy
настоящее время я использую 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.
Спасибо!
РЕДАКТИРОВАТЬ:
Скорость до приблизительно в 10 раз путем повторного написания цикла питона в C по сравнению с использованием Numpy.
Спасибо, что указали, что я не считал, что scipy convolve может быть неэффективным. Похоже, хотя я не слишком внимательно проверял, что scipy convolve выполняет довольно немного операций манипуляции с памятью и имеет ряд утверждений if, замедляющих работу. Я отправлю результаты и благодарю всех за ваши комментарии. – Bear
Да, convolve2d довольно неэффективен, так как он имеет дело с общим случаем (он имеет дело с произвольными объектами - вы должны быть способны свернуться с массивом десятичных объектов, например). Я думаю, что его можно значительно ускорить, используя специальные кодеки для общего случая (в частности, чтобы избежать вызова указателя функции внутри тройного цикла, который, скорее всего, будет одним из хостов. –