Bea*_*ear 18 python math numpy convolution scipy
我想使用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)
Run Code Online (Sandbox Code Playgroud)
我正在处理图像数据,使用灰度(0到255之间的整数值),我目前每个卷积得到大约四分之一秒.我的想法是做以下其中一项:
使用corepy,最好进行一些优化使用icc和ikml重新编译numpy.使用python-cuda.
我想知道是否有人对这些方法有任何经验(什么样的增益是典型的,如果值得花时间),或者是否有人知道有更好的库与Numpy进行卷积.
谢谢!
编辑:
通过使用Numpy在C中重写python循环来加速大约10倍.
The*_*ran 10
用于进行2d卷积的scipy中的代码有点混乱且未经优化.如果你想了解scipy的低级功能,请参见http://svn.scipy.org/svn/scipy/trunk/scipy/signal/firfilter.c.
如果您想要的只是使用您展示的小型常量内核进行处理,那么这样的函数可能会起作用:
def specialconvolve(a):
# sorry, you must pad the input yourself
rowconvol = a[1:-1,:] + a[:-2,:] + a[2:,:]
colconvol = rowconvol[:,1:-1] + rowconvol[:,:-2] + rowconvol[:,2:] - 9*a[1:-1,1:-1]
return colconvol
Run Code Online (Sandbox Code Playgroud)
这个函数利用了像上面建议的DarenW那样的内核的可分离性,以及利用更优化的numpy算术例程.通过我的测量,它比convolve2d函数快1000多倍.
| 归档时间: |
|
| 查看次数: |
6285 次 |
| 最近记录: |