4

MemoryView現在、Cythonpyxファイルで s を次のように設定しています。

@cython.boundscheck(False)
cdef int[:] fill_memview():
    # This happens inside a big loop so needs to be fast
    cdef int[:] x = np.empty(10)
    for i in range(10):
        x[i] = i
    return x

cdef stupid_loop():
    for i in range(10000):
        fill_memview()

pyxファイルをコンパイルすると、結果の注釈付きファイルに濃い黄色で表示さcython -a foo.pyxれる行が表示されます (多くの Python 呼び出しがあり、速度が低下していることを意味します)。cdef int[:] x = np.empty(10)html

型付けされた Memoryview をより適切にインスタンス化するにはどうすればよいですか?

4

2 に答える 2

3

メモリを割り当てるさまざまな方法の比較については、この回答を参照してください。ニーズが単純な場合 (単にインデックスを作成するだけ)、'cpython.array 生の C タイプ' に特に注意してください。cpython 配列を作成して高速に作成し、as_ints[i]安全でない高速インデックス作成に使用するか、メモリ ビューが本当に必要な場合はメモリcpython 配列でのビューは、numpy 配列よりも 3 倍高速です。

コードが何をするかの全体像がなければ、より具体的なアドバイスを提供することは困難です。たとえば、可能であれば、2 次元配列を使用したほうがよいでしょう。大量の小さなメモリ チャンクよりも 1 つの大きなメモリ チャンクを割り当てる方がはるかに効率的である傾向があるためです。たとえば、小さなメモリ ビュー スライスを多数作成する方がはるかに高速です。割り当てられたメモリの大きな塊を持つ 1 つの大きなメモリ ビューを作成するよりも、割り当てられたメモリの小さな断片をそれぞれ持つ小さなメモリ ビューの束を作成する必要があります。

于 2014-11-10T22:07:23.447 に答える
1

Python はそれを参照カウントする必要があるため、あなたのメモリビューは (厳密に必要なよりも) 遅いです。Python/C API を使用して手動でメモリを割り当てることができますが、不要になったときにメモリを解放する必要があります。

プロファイラーを使用していて、許容できない量の refcounting オーバーヘッドが発生している場合を除き、これを行わないでください。時期尚早の最適化は決して良い考えではなく、この方法ではメモリ リークやセグメンテーション フォールトが発生しやすくなります。

于 2014-11-10T14:45:52.900 に答える