介绍性说明:尝试使用 Cython 加速 Python+Numpy 代码是一个常见问题,这个问题试图创建一个关于可以有效加速哪些类型的操作的规范问题。虽然我试图用一个具体的例子来说明,但这只是为了说明——请不要过多关注这个毫无意义的例子。
另外,我对 Cython 做出了足够的贡献,我应该声明一个从属关系(鉴于我正在提出这个主题)
实际问题
假设我有一个函数尝试对 Numpy 数组进行数值计算。它使用相当典型的操作:
np.sin)。a-b)import numpy as np
def some_func(a, b):
"""
a and b are 1D arrays
This is intended to be illustrative! Please don't focus on what it
actually does!
"""
transformed_a = np.zeros_like(a)
last = 0
for n in range(1, a.shape[0]):
an = a[n]
if an > 0:
delta = an - a[n-1]
transformed_a[n] = delta*last
else:
last …Run Code Online (Sandbox Code Playgroud) 关于cython中的内存视图,使用NumPy类型键入视图是否有任何优势,例如,如果我正在处理numpy浮点数组,np.float_t而不是简单地做double?
我应该cdef以同样的方式输入,例如
ctypedef np.float64_t np_float_t
...
@cython.profile(False)
@cython.wraparound(False)
@cython.boundscheck(False)
cdef np_float_t mean_1d(np_float_t [:] v) nogil:
cdef unsigned int n = v.shape[0]
cdef np_float_t n_sum = 0.
cdef Py_ssize_t i
for i in range(n):
n_sum += v[i]
return n_sum / n
Run Code Online (Sandbox Code Playgroud) 在查看 scikit-learn 中的一些源代码时,我注意到tree.pxd以下一些类型声明:
import numpy as np
cimport numpy as np
ctypedef np.npy_float32 DTYPE_t # Type of X
ctypedef np.npy_float64 DOUBLE_t # Type of y, sample_weight
ctypedef np.npy_intp SIZE_t # Type for indices and counters
ctypedef np.npy_int32 INT32_t # Signed 32 bit integer
ctypedef np.npy_uint32 UINT32_t # Unsigned 32 bit integer
Run Code Online (Sandbox Code Playgroud)
我知道这里的 Cython 文档有一些关于 C 类型和 cython 类型之间的区别的讨论,但这些似乎是来自 numpy 的类型,并且文档中没有提到它们。
我对应该使用什么类型感到困惑。对于索引,我应该使用SIZE_t上面定义的,还是unsigned int?这些真的有必要ctypedef存在吗?
从这个问题(How big can a 64bitsigned integer be?),我了解到在 64 位机器上可以使用的最大数字是2^64-1,即92,233,720,368,547,758,070。这意味着,即使我添加1它,它也应该返回inf. 但它没有显示inf。这是我观察到的:
>>> max = sys.maxsize
>>> format(max, ',')
'9,223,372,036,854,775,807'
>>> a = max * 10
>>> format(a, ',')
'92,233,720,368,547,758,070'
>>> a / max
10.0
Run Code Online (Sandbox Code Playgroud)
即使由于某种原因92,233,720,368,547,758,070不是Python的最大数字,那么 又有什么用呢sys.maxsize?
其次,64位的数字不应该占用64位的内存空间吗?为什么 和max都a服用36 bytes?
>>> sys.getsizeof(max)
36
>>> sys.getsizeof(a)
36
Run Code Online (Sandbox Code Playgroud)
谁能描述一下这两种混乱吗?