Cython 初学者 - 加速 numpy 广播

Han*_*ver 2 python arrays numpy cython

第一次尝试 Cython,试图在一个对 2 个 numpy 数组和一个 float32 进行减法和加法的函数上获得加速。我试图让这个函数尽可能快地被调用很多次,如果我能加快速度,那么这是一个巨大的胜利。

 def broadcast(w, m, spl):
       """
       w and m are float32 ndarrays e.g shape (43,)
       spl is an nd.float32 value e.g 9722.0
       """
        return w + (m - spl)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的 cythonising 是

import numpy as np
cimport numpy as np
DTYPE = np.float32
ctypedef np.float32_t DTYPE_t

def broadcast(np.ndarray w, np.ndarray m, np.float32 spl):
    return w + (m - spl)
Run Code Online (Sandbox Code Playgroud)

但它返回错误:

'float32' is not a type identifier
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我不能声明类型?我需要声明一个 C 类型吗?什么是 C 中的 np.float32?

Sau*_*tro 5

正如@YXD 所评论的,使用 Cython 循环数组以执行这些操作不会提高速度。特别是对于简单的操作,Numpy 使用非常高效的 SIMD 编程。

尽管如此w如果不再需要原始数组,您可以通过修改数组来提高内存使用率和性能:

def func(w, m, spl)
    w += m
    w -= spl
Run Code Online (Sandbox Code Playgroud)

然后,而不是调用:

out = func(w, m, spl)
Run Code Online (Sandbox Code Playgroud)

新电话:

func(w, m, spl)
Run Code Online (Sandbox Code Playgroud)

将输出存储在w.