Например, если я это сделаю:
cdef np.ndarray[np.int64_t, ndim=1] my_array
Где хранится мой my_array
? Я бы подумал, что, поскольку я не сказал, что cython хранит в куче, он будет храниться в стеке, но после выполнения следующего эксперимента кажется, что он хранится в куче или как-то эффективно управляется памятью. Как память управляется по отношению к my_array
? Может быть, мне не хватает чего-то очевидного, но я не мог найти на нем никакой документации.
import numpy as np
cimport cython
cimport numpy as np
from libc.stdlib cimport malloc, free
def big_sum():
# freezes up:
# "a" is created on the stack
# space on the stack is limited, so it runs out
cdef int a[10000000]
for i in range(10000000):
a[i] = i
cdef int my_sum
my_sum = 0
for i in range(10000000):
my_sum += a[i]
return my_sum
def big_sum_malloc():
# runs fine:
# "a" is stored on the heap, no problem
cdef int *a
a = <int *>malloc(10000000*cython.sizeof(int))
for i in range(10000000):
a[i] = i
cdef int my_sum
my_sum = 0
for i in range(10000000):
my_sum += a[i]
with nogil:
free(a)
return my_sum
def big_numpy_array_sum():
# runs fine:
# I don't know what is going on here
# but given that the following code runs fine,
# it seems that entire array is NOT stored on the stack
cdef np.ndarray[np.int64_t, ndim=1] my_array
my_array = np.zeros(10000000, dtype=np.int64)
for i in range(10000000):
my_array[i] = i
cdef int my_sum
my_sum = 0
for i in range(10000000):
my_sum += my_array[i]
return my_sum