繁体   English   中英

Cython 用零初始化矩阵

[英]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)

你不想写这样的代码:

  1. int[40000][40000] mat在堆栈上生成一个 6 GB 的数组(假设为 4 字节整数)。 通常,最大堆栈大小约为几 Mb。 我不知道这不会使您的 PC 崩溃。

  2. 但是,当我从 f2() 返回数组时 [...]

    您分配的数组完全是函数本地的。 从 C 的角度来看,您无法返回它,因为它在函数完成后不再存在。 我认为 Cython 可能会为您将其转换为(嵌套的)Python 列表。 这需要逐个元素的慢速复制,这不是您想要的。

对于您在这里所做的事情,仅使用 Numpy 会更好


Cython 不支持 C arr = {}的良好等效项,因此如果您确实想要初始化合理的小型 C 数组,则需要使用一个:

  1. 循环,
  2. memset (您可以从cimport libc.string ),
  3. 创建它的类型化内存视图并执行memview[:,:] = 0

numpy 版本在我的电脑上用了 3 秒,而 c 版本只用了 2.4e-5 秒。

这种差异通常表明 C 编译器已经优化了一些代码(通过检测结果未使用)。 这不太可能是真正的加速。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM