Я не совсем понимаю, как выполняется подсчет ссылок с памятью в больших/длинных разделах ног. Давайте предположим, что в основном весь мой код - это nogil, за исключением создания глубокого представления numpy-array-to-memoryview. Представление памяти возвращается и используется вверх.
Довольно простым примером может быть
import numpy as np
cdef:
double[::1] mv
cdef double[::1] someFun(int nn) nogil:
cdef:
double[::1] mvb
with gil:
mvb = np.arange(nn, dtype=np.double)
return mvb
with nogil:
mv = someFun(30)
# Here could be MUCH more "nogil" code
# How is memory management/reference counting done here?
Я предполагаю, что когда someFun() возвращает представление памяти, счетчик ссылок массива numpy все еще должен быть равен 1. Как Cython впоследствии обрабатывает подсчет ссылок? Я имею в виду, что нельзя изменить счетчик ссылок, даже если представление памяти/массив разыменовано, верно? И как он узнает, что нужно разыменовать представление памяти, если выше было несколько слоев с кодом nogil, и, возможно, в отличие от someFun(), представление памяти не возвращается вверх?
EDIT: Итак, я нашел довольно грубый способ провести еще несколько тестов. Мой код теперь выглядит так.
import numpy as np
cdef extern from "stdio.h":
int getchar() nogil
int printf(const char* formatt, ...) nogil
cdef:
double[::1] mv, mv2 = np.ones(3)
int ii, leng = 140000000
cdef double[::1] someFun(int nn) nogil:
cdef:
double[::1] mvb
with gil:
mvb = np.ones(nn, dtype=np.double)
return mvb
with nogil:
mv = someFun(leng)
printf("1st stop")
getchar()
mv = mv2
printf("2nd stop")
getchar()
Интересная часть для меня заключается в том, что на 1-й остановке массив/просмотр памяти mv
все еще выделяется, но когда я разыменовываю его, он освобождается до 2-й остановки. Я только проверил использование памяти с htop
(поэтому массив выбран таким большим), возможно, есть лучший способ. Очевидно, что я хочу, чтобы это поведение free/refcounting произошло, но странно, что оно делает это, когда у него нет GIL. Может memoryviews не совсем ногил?
Может кто-нибудь объяснить, если это надежное поведение?