Python使用numpy加速嵌套循环

Python使用numpy加速嵌套循环,python,algorithm,numpy,Python,Algorithm,Numpy,嗨,我正在尝试制作一个python代码的尹算法 在第3步中,我必须使用三重for循环作为下面的代码 def auto(t, lag, samples): total_index = len(samples) zero_padded = np.append(samples, np.zeros(total_index)) # 2nd for loop changed to numpy return np.sum(zero_padded[t+1: t+total_ind

嗨,我正在尝试制作一个python代码的尹算法

在第3步中,我必须使用三重for循环作为下面的代码

def auto(t, lag, samples):
    total_index = len(samples)
    zero_padded = np.append(samples, np.zeros(total_index))
    # 2nd for loop changed to numpy
    return np.sum(zero_padded[t+1: t+total_index+1] * zero_padded[t+1+lag: t+total_index+1+lag])

def diff_function(lag, rt0, samples):
    return rt0 + auto(lag, 0, samples) - (2*auto(0, lag, samples))

# cumulative mean nomalized difference function
def CMN_diff_function(lag, rt0, samples):
    nomalization = 0
    for j in range(1, lag + 1):    # 3rd for loop that I want to change
        nomalization += diff_function(rt0, j, samples)
    nomalization = nomalization / lag

    return diff_function(rt0, lag, samples) / nomalization

rt0 = auto(0, 0, samples)
cmn_diff = [1]
for lag in range(1, 2700):    # 1st for loop
    print lag
    cmn_diff.append(CMN_diff_function(lag, rt0, samples))
def CMN_diff_function(lag, rt0, samples):
    nomalization = np.fromfunction(functools.partial(diff_function, rt0=rt0, samples=samples), (lag+1,), dtype=int)
    nomalization = np.sum(nomalization)/lag

    return diff_function(lag, rt0, samples)/nomalization
我用numpy从auto函数更改了second for循环

代码仍然很慢,我需要更改第三个for循环

我尝试使用numpy的from函数,如下代码所示

def auto(t, lag, samples):
    total_index = len(samples)
    zero_padded = np.append(samples, np.zeros(total_index))
    # 2nd for loop changed to numpy
    return np.sum(zero_padded[t+1: t+total_index+1] * zero_padded[t+1+lag: t+total_index+1+lag])

def diff_function(lag, rt0, samples):
    return rt0 + auto(lag, 0, samples) - (2*auto(0, lag, samples))

# cumulative mean nomalized difference function
def CMN_diff_function(lag, rt0, samples):
    nomalization = 0
    for j in range(1, lag + 1):    # 3rd for loop that I want to change
        nomalization += diff_function(rt0, j, samples)
    nomalization = nomalization / lag

    return diff_function(rt0, lag, samples) / nomalization

rt0 = auto(0, 0, samples)
cmn_diff = [1]
for lag in range(1, 2700):    # 1st for loop
    print lag
    cmn_diff.append(CMN_diff_function(lag, rt0, samples))
def CMN_diff_function(lag, rt0, samples):
    nomalization = np.fromfunction(functools.partial(diff_function, rt0=rt0, samples=samples), (lag+1,), dtype=int)
    nomalization = np.sum(nomalization)/lag

    return diff_function(lag, rt0, samples)/nomalization
但我犯了个错误

return np.sum(zero_padded[t+1: t+total_index+1] * zero_padded[t+1+lag: t+total_index+1+lag])
TypeError: only integer arrays with one element can be converted to an index
因为自动函数获取列表类型作为t或lag的参数

如何加速此功能


我应该使用多处理吗?

代码看起来可以很容易地重写为Cython,因此如果您不想使用纯Python解决方案,我建议您这样做。另外,您能提供一些示例数据吗?@SergeiLebedev sample是一个长度为20000的声音。代码看起来可以很容易地重写为Cython,因此,如果您不想要纯Python解决方案,我建议您这样做。另外,你能提供一些样本数据吗?@SergeiLebedev样本是一个长度为20000的声音