我想使用类型化的内存视图优化一个函数,但我不知道参数类型应该是什么。它可以是numpy数组,甚至可以是标量。那么,我该如何使用类型化的内存视图呢?
我想使用类型化的内存视图优化一个函数,但我不知道参数类型应该是什么。它可以是numpy数组,甚至可以是标量。那么,我该如何使用类型化的内存视图呢?
cimport cython
import numpy as np
import numbers
@cython.boundscheck(False)
cdef double[:] _plus_one_impl(double[:] x):
cdef int n
cdef double[:] output
output = x.copy()
for n in range(x.shape[0]):
output[n] = x[n]+1
return output
def plus_one(x):
if isinstance(x,numbers.Real): # check if it's a number
return _plus_one_impl(np.array([x]))[0]
else:
try:
return _plus_one_impl(x)
except ValueError: # this gets thrown if conversion fails
if len(x.shape)<2:
raise ValueError('x could not be converted to double [:]')
output = np.empty_like(x) # output is all numpy, whatever the input is
for n in range(x.shape[0]): # this loop isn't typed, so is likely to be pretty slow
output[n,...] = plus_one(x[n,...])
return output
在某些情况下,这段代码可能会变得有些慢(即第二维度较短的2D数组)。
然而,我的真正建议是研究一下NumPy ufuncs,它们提供了一个有效地实现这种操作的接口。(请参阅http://docs.scipy.org/doc/numpy-dev/user/c-info.ufunc-tutorial.html)。不幸的是,它们比Cython更加复杂。