Me gustaría mejorar el rendimiento de la convolución usando python, y esperaba obtener una idea de cómo mejorar el rendimiento.Mejorando el rendimiento de Numpy
Actualmente estoy usando scipy para realizar la convolución, utilizando el código de algo así como el fragmento a continuación:
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)
estoy de procesamiento de datos de imagen, usando la escala de grises (valores enteros entre 0 y 255), y en la actualidad consigo aproximadamente un cuarto de segundo por convolución. Mi pensamiento era hacer una de las siguientes:
Usar corepy, preferiblemente con algunas optimizaciones Recompilar numpy con icc & ikml. Utilice python-cuda.
Me preguntaba si alguien tenía alguna experiencia con cualquiera de estos enfoques (qué tipo de ganancia sería típica, y si vale la pena el tiempo), o si alguien conoce una mejor biblioteca para realizar convolución con Numpy.
Gracias!
EDIT:
velocidad de aproximadamente 10 veces por el bucle pitón re-escrito en C sobre el uso de Numpy.
Gracias por señalar eso, no había considerado que la convolvente scipy pudiera ser tan ineficiente. Parece que, aunque no lo he comprobado tan de cerca, esa convoluta coincidencia está haciendo bastantes operaciones de manipulación de memoria y tiene varias declaraciones if que ralentizan las cosas. Publicaré los resultados y les agradeceré a todos sus comentarios. – Bear
Sí, convolve2d es bastante ineficiente, ya que se trata del caso general (se trata de objetos arbitrarios, por ejemplo, debe poder convolucionar con una matriz de objetos decimales). Creo que podría acelerarse considerablemente utilizando rutas de codificación especiales para el caso común (en particular para evitar la llamada al puntero de función dentro del lazo triple, que es muy probable que sea uno de los hostpot. –