在__dealloc__的cython PyObject中创建的temp np ndarray我应该怎么做

时间:2018-11-22 03:57:02

标签: python numpy cython

我正在尝试更改一些代码,并且必须在cython类中创建一个np.ndarray

cdef class T:

    def __cinit__(self, X):
        # copy a memory space by the numpy way
        cdef np.ndarray temp = np.ndarray(shape=X.shape, dtype=X.dtype)
        self.X_fake = <DTYPE_t*> temp.data

    def __dealloc__(self):
        # should I free this?
        free(self.X_fake)

我在numpy或cython doc中找不到任何内容。我知道如果我使用malloc创建DTYPE_t *指针,那么它很容易工作,我只是想知道是否应该释放self.X_fake,或者我如何才能释放temp ndarray,所以cython将通过gc工作流释放一个numpy类?

1 个答案:

答案 0 :(得分:0)

正如@ead指出的那样,当前temp是一个自动变量,它将在__cinit__的末尾超出范围。这意味着self.X_fake不会指向任何内容,并可能会导致您遇到问题。这是修复代码的最简单方法:

import numpy as np
cimport numpy as np

ctypedef np.float64_t DTYPE_t

cdef class T:
    cdef np.ndarray temp
    cdef DTYPE_t* X_fake

    def __cinit__(self, X):
        # copy a memory space by the numpy way
        self.temp = np.ndarray(shape=X.shape, dtype=X.dtype)
        self.X_fake = <DTYPE_t*> self.temp.data

这样,temp将共享其所属的T实例的生存期。您不需要__dealloc__。当temp超出范围时,将自动清除T的给定实例中的所有其他内容。

此外,您还将知道是否必须free属于指针的内存,因为在这种情况下,首先要使用malloc创建它。如果您没有malloc,请不要free