【问题标题】:Scipy's correlate function is slowScipy的相关函数很慢
【发布时间】:2015-06-03 12:20:01
【问题描述】:

我比较了使用 numpy/scipy 对两个信号进行卷积/关联的不同方法。事实证明,速度存在巨大差异。我比较了以下方法:

  • 从 numpy 包中关联(绘图中的 np.correlate)
  • 来自 scipy.signal 包的关联(sps.correlate in plot)
  • fftconvolve from scipy.signal(sps.fftconvolve in plot)

现在我当然明白 fftconvolve 和其他两个函数之间存在相当大的差异。我不明白为什么sps.correlate 比np.correlate 慢得多。有人知道为什么 scipy 使用这么慢的实现吗?

为了完整起见,这里是产生情节的代码:

import time

import numpy as np
import scipy.signal as sps

from matplotlib import pyplot as plt


if __name__ == '__main__':

    a = 10**(np.arange(10)/2)
    print(a)

    results = {}
    results['np.correlate'] = np.zeros(len(a))
    results['sps.correlate'] = np.zeros(len(a))
    results['sps.fftconvolve'] = np.zeros(len(a))

    ii = 0
    for length in a:

        sig = np.random.rand(length)

        t0 = time.clock()
        for jj in range(3):
            np.correlate(sig, sig, 'full')
        t1 = time.clock()
        elapsed = (t1-t0)/3

        results['np.correlate'][ii] = elapsed

        t0 = time.clock()
        for jj in range(3):
            sps.correlate(sig, sig, 'full')
        t1 = time.clock()
        elapsed = (t1-t0)/3

        results['sps.correlate'][ii] = elapsed

        t0 = time.clock()
        for jj in range(3):
            sps.fftconvolve(sig, sig, 'full')
        t1 = time.clock()
        elapsed = (t1-t0)/3

        results['sps.fftconvolve'][ii] = elapsed

        ii += 1

    ax = plt.figure()
    plt.loglog(a, results['np.correlate'], label='np.correlate')
    plt.loglog(a, results['sps.correlate'], label='sps.correlate')
    plt.loglog(a, results['sps.fftconvolve'], label='sps.fftconvolve')
    plt.xlabel('Signal length')
    plt.ylabel('Elapsed time in seconds')

    plt.legend()
    plt.grid()

    plt.show()

【问题讨论】:

标签: python numpy scipy


【解决方案1】:

根据文档,numpy.correlate 是为一维阵列设计的,而scipy.correlate 可以接受 ND 阵列。

scipy 实现更通用,因此更复杂,似乎确实会产生额外的计算开销。您可以比较 numpyscipy 实现之间的 C 代码。

另一个区别,例如,numpy 实现可以更好地被现代处理器上的编译器向量化,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2018-01-23
    • 2022-06-10
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多