Что мне делать с временным файлом np ndarray, созданным в Cython PyObject в __dealloc__ - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь изменить какой-то код, и мне нужно создать np.ndarray в классе cython

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)

Я ничего не нашел в dumpy или cython doc.Я знаю, если я использую malloc для создания указателя DTYPE_t *, это легко работать, я просто хочу знать, должен ли я освободить self.X_fake или как я могу освободить временный массив, cython освободит пустой класс с помощью рабочего процесса gc

1 Ответ

0 голосов
/ 22 ноября 2018

Как указал @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 это.

...