Cython: создать объект ndarray без выделения памяти для данных
В Cython, как мне создать объект ndarray с определенными свойствами, не выделяя память для его содержимого?
Моя проблема в том, что я хочу вызвать функцию, которая требует ndarray, но мои данные находятся в чистом массиве c. Из-за некоторых ограничений я не могу переключиться на использование ndarray напрямую.
Code-segement для иллюстрации моего намерения:
cdef:
ndarray[npy_uint64] tmp_buffer
uint64_t * my_buffer
tmp_buffer = np.empty(my_buffer_size, dtype='uint64')
my_buffer = <uint64_t *> malloc(my_buffer_size * sizeof(uint64_t))
(... do something with my_buffer that cannot be done with a ndarray ...)
tmp_buffer.data = my_buffer
some_func(tmp_buffer)
Это кажется неэффективным, так как для tmp_buffer
память распределена и заполнена нулями, которые никогда не будут использоваться. Как мне избежать этого?
1 ответ
Помимо эффективности, компилируется ли такое назначение?
np.empty
не заполнять нулями. np.zeros
делает это, и даже это делается "на лету".
Почему разница в производительности между numpy.zeros и numpy.zeros_like? исследует как empty
, zeros
а также zeros_like
реализованы.
Я только начинающий с cython
, но я должен использовать:
tmp_buffer.data = <char *>my_buffer
Как насчет идти другим путем, делая my_buffer
выделенный data
из tmp_buffer
?
array1 = np.empty(bsize, dtype=int)
cdef int *data
data = <int *> array1.data
for i in range(bsize):
data[i] = bsize-data[i]
http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html предлагает использовать np.PyArray_SimpleNewFromData
создать массив из существующего буфера данных.
Относительно просмотров памяти http://docs.cython.org/src/userguide/memoryviews.html