bunu yaparsam? Cython'un yığında saklanacağını söylemediğimden beri, yığın üzerinde saklanacağını düşünürdüm, ancak aşağıdaki denemeyi yaptıktan sonra, yığında saklandığını ya da bir şekilde verimli bir şekilde belleğin yönetildiğini görüyoruz. Bellek my_array
'a göre nasıl yönetiliyor? Belki bariz bir şey eksik, ama üzerinde herhangi bir belge bulamadım.Bellek np.ndarray için cython'da nasıl kullanılır?</p> <pre><code>cdef np.ndarray[np.int64_t, ndim=1] my_array </code></pre> <p>Nerede benim <code>my_array</code> depolanır: Örneğin
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
Neden oluşturulan C dosyasına bir göz atmıyorsunuz? Her neyse, cython'un, tahsis için “pyMalloc” diye adlandırılan ve çağrı için tahsis edilen numpy işlevlerini çağırdığına inanıyorum. numpy yok * belleğini yönetmiyor. Sadece python tahsislerine/tahsisatlara dayanır. – Bakuriu
@Bakuriu, Yorumunuz için teşekkürler, bu mantıklı ve çok yardımcı olur, ancak bu adımları daha ayrıntılı olarak açıklayan bir kaynak biliyor musunuz? Oluşturulan C dosyasına bakmayı denedim, ancak 6000'den fazla kod içeriyor ve ben bunu anlayamadım. – Akavall
Neredeyse kesinlikle yığın oluyor - dizinin boyutunun bildirme zamanında bilinmediğini düşünün, genellikle büyük dizilerde çalışır ve yığın sınırlı. Yığın optimizasyonu teknik olarak mümkün olsa da, ndarray'ın görünümleri olabilir, bu nedenle veri referansı geçerli kapsamdan çıkabilir. Bu şekilde, onu yığın halinde uygulamak daha kolaydır. Mümkünse bir MemoryView kullanın veya http://docs.cython.org/src/userguide/memoryviews.html için http://docs.cython.org/src/tutorial/numpy.html –