[英]Cython initialize matrix with zeros
描述
我只是想创建一个由0
填充的rows x cols
的矩阵。 总是使用 numpy 我认为使用文档中描述的np.zeros
是最简单的:
DTYPE = np.int
ctypedef np.int_t DTYPE_t
def f1():
cdef:
int dim = 40000
int i, j
np.ndarray[DTYPE_t, ndim=2] mat = np.zeros([40000, 40000], dtype=DTYPE)
for i in range(dim):
for j in range(dim):
mat[i, j] = 1
然后我使用 c 中的数组进行了比较:
def f2():
cdef:
int dim = 40000
int[40000][40000] mat
int i, j
for i in range(dim):
for j in range(dim):
mat[i][j] = 1
numpy 版本在我的电脑上用了3 secs
,而 c 版本只用了2.4e-5 secs
。 但是,当我从f2()
返回数组时,我注意到它不是零填充的(当然这里不能, i==j
但是当不填充它时,它也不会返回 0 数组)。 如何在 cython 中做到这一点。 我知道在常规 C 中它会像: int arr[n][m] = {};
.
问题
如何用0s
填充 c 数组? (如果我的代码中有明显错误,我会选择 numpy)
你不想写这样的代码:
int[40000][40000] mat
在堆栈上生成一个 6 GB 的数组(假设为 4 字节整数)。 通常,最大堆栈大小约为几 Mb。 我不知道这不会使您的 PC 崩溃。
但是,当我从 f2() 返回数组时 [...]
您分配的数组完全是函数本地的。 从 C 的角度来看,您无法返回它,因为它在函数完成后不再存在。 我认为 Cython 可能会为您将其转换为(嵌套的)Python 列表。 这需要逐个元素的慢速复制,这不是您想要的。
对于您在这里所做的事情,仅使用 Numpy 会更好。
Cython 不支持 C arr = {}
的良好等效项,因此如果您确实想要初始化合理的小型 C 数组,则需要使用一个:
memset
(您可以从cimport
libc.string
),memview[:,:] = 0
numpy 版本在我的电脑上用了 3 秒,而 c 版本只用了 2.4e-5 秒。
这种差异通常表明 C 编译器已经优化了一些代码(通过检测结果未使用)。 这不太可能是真正的加速。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.