如何知道scipy函数是否使用C代码?

时间:2015-01-02 19:06:14

标签: numpy scipy

有没有人知道scipy.signal.argrelmax和scipy.integrate.simps是否在其源代码中使用C代码或者它们是纯Python?我想加快使用Numba,所以问它。

http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.signal.argrelmax.html http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.simps.html

1 个答案:

答案 0 :(得分:2)

跟踪几个级别的调用,看起来argrelmax最终会使用此循环:

def _boolrelextrema(data, comparator...)
    # comparator - a function
    ....
    results = np.ones(data.shape, dtype=bool)
    main = data.take(locs, axis=axis, mode=mode)
    for shift in xrange(1, order + 1):
        plus = data.take(locs + shift, axis=axis, mode=mode)
        minus = data.take(locs - shift, axis=axis, mode=mode)
        results &= comparator(main, plus)
        results &= comparator(main, minus)
        if(~results.any()):
            return results

    order :  How many points on each side to use for the comparison

因此,如果order不是很大,迭代量很小,不应过多影响速度。

安装后

simps使用

def _basic_simps(y,start,stop,x,dx,axis):
    nd = len(y.shape)
    if start is None:
        start = 0
    step = 2
    all = (slice(None),)*nd
    slice0 = tupleset(all, axis, slice(start, stop, step))
    slice1 = tupleset(all, axis, slice(start+1, stop+1, step))
    slice2 = tupleset(all, axis, slice(start+2, stop+2, step))

    if x is None:  # Even spaced Simpson's rule.
        result = add.reduce(dx/3.0 * (y[slice0]+4*y[slice1]+y[slice2]),
                                    axis)
    else:
        # Account for possibly different spacings.
        ...
    return result

通过将add.reduce与预定义的切片组一起使用,我猜它会尽可能快。

所以这些并没有在C中特别编码,但它们可以有效地利用numpy向量化操作。我的猜测是,使用numpy和/或cython来加速它们需要做很多工作 - 除非你专注于一些特殊情况。