【发布时间】:2014-05-16 21:51:40
【问题描述】:
我有以下代码,它执行标准化互相关,在 python 中寻找两个信号的相似性:
def normcorr(template,srchspace):
template=(template-np.mean(template))/(np.std(template)*len(template)) # Normalize template
CCnorm=srchspace.copy()
CCnorm=CCnorm[np.shape(template)[0]:] # trim CC matrix
for a in range(len(CCnorm)):
s=srchspace[a:a+np.shape(template)[0]]
sp=(s-np.mean(s))/np.std(s)
CCnorm[a]=numpy.sum(numpy.multiply(template,sp))
return CCnorm
但是你可以想象它太慢了。查看 cython 文档,在原始 python 中执行循环时,速度会大大提高。因此,我尝试编写一些 cython 代码,其中包含如下所示的变量数据类型:
from __future__ import division
import numpy as np
import math as m
cimport numpy as np
cimport cython
def normcorr(np.ndarray[np.float32_t, ndim=1] template,np.ndarray[np.float32_t, ndim=1] srchspace):
cdef int a
cdef np.ndarray[np.float32_t, ndim=1] s
cdef np.ndarray[np.float32_t, ndim=1] sp
cdef np.ndarray[np.float32_t, ndim=1] CCnorm
template=(template-np.mean(template))/(np.std(template)*len(template))
CCnorm=srchspace.copy()
CCnorm=CCnorm[len(template):]
for a in range(len(CCnorm)):
s=srchspace[a:a+len(template)]
sp=(s-np.mean(s))/np.std(s)
CCnorm[a]=np.sum(np.multiply(template,sp))
return CCnorm
但是一旦我编译它,代码实际上比纯 python 代码运行得慢。我在这里 (How to call numpy/scipy C functions from Cython directly, without Python call overhead?) 发现从 cython 调用 numpy 可能会显着减慢代码速度,这是我的代码的问题吗,在这种情况下,我必须定义内联函数来替换对 np 的所有调用,或者还有什么我我做错了吗?
【问题讨论】: