如何知道 scipy 函数是否使用 C 代码?
How to know if scipy function uses C code?
有谁知道 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
通过几个级别的调用进行跟踪,看起来 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
and/or cython
加速它们将需要大量工作——除非你关注一些特殊情况。
有谁知道 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
通过几个级别的调用进行跟踪,看起来 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
and/or cython
加速它们将需要大量工作——除非你关注一些特殊情况。