相关疑难解决方法(0)

我可以使用 Cython 加速 Numpy 密集型函数的哪些部分

介绍性说明:尝试使用 Cython 加速 Python+Numpy 代码是一个常见问题,这个问题试图创建一个关于可以有效加速哪些类型的操作的规范问题。虽然我试图用一个具体的例子来说明,但这只是为了说明——请不要过多关注这个毫无意义的例子。

另外,我对 Cython 做出了足够的贡献,我应该声明一个从属关系(鉴于我正在提出这个主题)


实际问题

假设我有一个函数尝试对 Numpy 数组进行数值计算。它使用相当典型的操作:

  • 对不易矢量化的数组元素进行循环
  • 调用 Numpy/Scipy 函数(在本例中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)

python numpy cython

10
推荐指数
1
解决办法
729
查看次数

Cython:对于类型化的内存视图,我应该使用np.float_t而不是double

关于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)

python numpy typing cython memoryview

9
推荐指数
1
解决办法
3220
查看次数

Cython:声明无符号整数的正确方法

在查看 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存在吗?

python numpy cython

5
推荐指数
1
解决办法
4754
查看次数

Python 如何处理大于 64 位无符号整数限制的数字?

从这个问题(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位的内存空间吗?为什么 和maxa服用36 bytes

>>> sys.getsizeof(max)
36
>>> sys.getsizeof(a)
36
Run Code Online (Sandbox Code Playgroud)

谁能描述一下这两种混乱吗?

python 64-bit integer

5
推荐指数
1
解决办法
4063
查看次数

标签 统计

python ×4

cython ×3

numpy ×3

64-bit ×1

integer ×1

memoryview ×1

typing ×1