उदाहरण के लिए यदि मैं यह कर? मुझे लगता है कि चूंकि मैंने ढेर पर स्टोर करने के लिए साइथन को नहीं बताया था, इसलिए इसे स्टैक पर संग्रहीत किया जाएगा, लेकिन निम्नलिखित प्रयोग करने के बाद ऐसा लगता है कि यह ढेर पर संग्रहीत है, या किसी भी तरह कुशलतापूर्वक स्मृति प्रबंधित है। स्मृति को my_array
के संबंध में कैसे प्रबंधित किया जाता है? शायद मुझे कुछ याद आ रही है, लेकिन मुझे इस पर कोई दस्तावेज नहीं मिला।साइथन में np.ndarray के लिए स्मृति को कैसे संभाला जाता है?</p> <pre><code>cdef np.ndarray[np.int64_t, ndim=1] my_array </code></pre> <p>मेरी <code>my_array</code> कहाँ संग्रहीत किया जाता है:
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
आप जेनरेट की गई सी फ़ाइल को क्यों न देखें? वैसे भी मुझे विश्वास है कि साइथन बस आवंटन के लिए numpy कार्यों को बुलाता है, जो 'PyMalloc' कहते हैं जो ढेर पर आवंटित करता है। numpy * नहीं * इसकी याददाश्त का प्रबंधन करता है। यह बस पाइथन आवंटन/deallocations पर निर्भर करता है। – Bakuriu
@ बाकुरीयू, आपकी टिप्पणी के लिए धन्यवाद, यह समझ में आता है और बहुत मदद करता है, लेकिन क्या आप ऐसे स्रोत के बारे में जानते हैं जो उन चरणों को अधिक विस्तार से बताता है? मैंने जेनरेट की गई सी फ़ाइल को देखने की कोशिश की, लेकिन यह कोड की 6000 से अधिक लाइनें है, और मैं इसे अधिक समझ नहीं पाया। – Akavall
यह लगभग निश्चित रूप से ढेर है - मान लें कि सरणी का आकार घोषणापत्र समय पर ज्ञात नहीं है, आमतौर पर बड़े एरे और स्टैक पर काम करता है। यद्यपि स्टैक अनुकूलन तकनीकी रूप से संभव है, 'ndarray का विचार देखा जा सकता है, इस प्रकार डेटा संदर्भ मौजूदा दायरे से बच सकता है। इस प्रकार, ढेर में इसे लागू करने के लिए यह आसान तरीका है। यदि संभव हो तो मेमोरी व्यू का उपयोग करें, या 'मेमोरी व्यू के http://docs.cython.org/src/userguide/memoryviews.html के लिए http://docs.cython.org/src/tutorial/numpy.html –