Cython 初学者 - 加速 numpy 广播
Cython beginner - speed up numpy broadcasting
第一次尝试 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)
到目前为止我的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)
但是 returns 错误:
'float32' is not a type identifier
我不知道为什么我不能声明类型?我需要声明 C 类型吗? C 中的 np.float32 是什么?
正如@YXD 所评论的那样,使用 Cython 循环遍历数组以执行这些操作不会提高速度。专门针对简单运算,Numpy使用SIMD编程,效率很高
尽管如此,您可以通过修改数组 w
来提高内存使用率和性能,如果不再需要原始数组:
def func(w, m, spl)
w += m
w -= spl
然后,而不是调用:
out = func(w, m, spl)
新来电:
func(w, m, spl)
将输出存储在 w
.
中
第一次尝试 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)
到目前为止我的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)
但是 returns 错误:
'float32' is not a type identifier
我不知道为什么我不能声明类型?我需要声明 C 类型吗? C 中的 np.float32 是什么?
正如@YXD 所评论的那样,使用 Cython 循环遍历数组以执行这些操作不会提高速度。专门针对简单运算,Numpy使用SIMD编程,效率很高
尽管如此,您可以通过修改数组 w
来提高内存使用率和性能,如果不再需要原始数组:
def func(w, m, spl)
w += m
w -= spl
然后,而不是调用:
out = func(w, m, spl)
新来电:
func(w, m, spl)
将输出存储在 w
.