私はこれを行う場合は?私はヒープ上に格納するようにcythonに指示しなかったので、スタックに格納されますが、以下の実験を行った後、ヒープに格納されているか、または効率的にメモリ管理されているようです。メモリはmy_array
に関してどのように管理されますか?たぶん私は何かを見逃しているかもしれませんが、私はそれに関する文書を見つけることができませんでした。cythonの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
生成されたCファイルを見てみませんか?とにかく、私はcythonが割り振りのためにnumpy関数を呼び出すと考えています。これは、ヒープに割り当てる 'PyMalloc'を呼び出します。 numpyはメモリを管理しません。単にPythonの割り当て/割り当て解除に依存しています。 – Bakuriu
@Bakuriu、あなたのコメントをありがとう、それは意味があり、多くの助けになりますが、それらの手順を詳細に説明する情報源を知っていますか?私は生成されたCファイルを見てみましたが、それは6000行以上のコードであり、それをあまり理解できませんでした。 – Akavall
これはほぼ確実にヒープです。宣言時に配列のサイズがわからない場合、numpyは通常大きな配列で動作し、スタックは限られています。スタックの最適化は技術的には可能ですが、 'ndarray'はビューであるため、データ参照は現在のスコープからエスケープできます。したがって、ヒープで実装する方が簡単です。可能であればMemoryViewを使用するか、http://docs.cython.org/src/tutorial/numpy.html「MemoryView'sのための –