加速Python Numpy代码
我有以下代码:加速Python Numpy代码,python,numpy,cython,Python,Numpy,Cython,我有以下代码: big_k = gabor((height * 2, width *2), (height, width)) for r_slice in range(0,radialSlices): r_pixels = r_slice * radialWidth for a_slice in range(0,angularSlices): a_pixels = a_slice * angularWidth k_win = big_k[height - r_pixels
big_k = gabor((height * 2, width *2), (height, width))
for r_slice in range(0,radialSlices):
r_pixels = r_slice * radialWidth
for a_slice in range(0,angularSlices):
a_pixels = a_slice * angularWidth
k_win = big_k[height - r_pixels:2*height - r_pixels,width - a_pixels:2 * width - a_pixels]
result = np.sum(img * k_win)
img
是一个640x480的uint8
阵列,big_k
是complex64
1280x960
此代码相当于1024个640x480矩阵乘法和对complex64的转换
这段代码在我的macbook上运行大约需要2秒;我想尝试获得100倍的加速。我能做什么?您所做的看起来有点像卷积运算,所以我建议尝试使用卷积运算来实现它。卷积可以通过基于FFT的方法非常有效地计算,并在SciPy中实现为
SciPy.signal.fftconvolve
您实际想要实现什么?实际上,这看起来就像一个大卷积。如果是这种情况,可以尝试使用Scipy的卷积函数,或者使用基于FFT的卷积方法。其思想是在图像的多个点上应用一个以点为中心的滤波器,然后取每个点上的结果值之和。仔细想想,它类似于卷积。我能把这两个数据进行卷积,然后在每个点上取结果吗?在这种情况下也不需要求和,好吗?还是我误解了?基本上,是的。卷积可能要快得多,您可以在图像中的每个点(或仅在选定点,由您选择)获得结果。试试看scipy.signal.fftconvolve
。好吧,太棒了,我刚试过。加速大约是2-3倍,这是一个巨大的进步,加上一个更“性感”的解决方案。这完全改变了代码,所以我猜这个问题得到了回答!我可以从这里继续优化。如果你想把答案写在下面,我会接受的!谢谢