<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 內存分配 > 原文: [http://docs.cython.org/en/latest/src/tutorial/memory_allocation.html](http://docs.cython.org/en/latest/src/tutorial/memory_allocation.html) 動態內存分配在 Python 中大多不是問題。一切都是對象,引用計數系統和垃圾收集器在不再使用時自動將內存返回給系統。 當談到更多低級數據緩沖區時,Cython 通過 NumPy,內存視圖或 Python 的 stdlib 數組類型特別支持簡單類型的(多維)數組。它們是全功能的,垃圾收集的,比 C 中的裸指針更容易使用,同時仍然保持速度和靜態類型的好處。參見 [使用 Python 數組](array.html#array-array) 和 [類型記憶視圖](../userguide/memoryviews.html#memoryviews) 。 但是,在某些情況下,這些對象仍然會產生不可接受的開銷,這可能會導致在 C 中進行手動內存管理。 簡單的 C 值和結構(例如局部變量`cdef double x`)通常在堆棧上分配并通過值傳遞,但對于更大和更復雜的對象(例如動態大小的雙精度列表),必須手動請求內存并釋放。 C 為此提供函數`malloc()`,`realloc()`和`free()`,可以從`clibc.stdlib`導入到 cython 中。他們的簽名是: ```py void* malloc(size_t size) void* realloc(void* ptr, size_t size) void free(void* ptr) ``` malloc 使用的一個非常簡單的示例如下: | ```py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ``` | ```py import random from libc.stdlib cimport malloc, free def random_noise(int number=1): cdef int i # allocate number * sizeof(double) bytes of memory cdef double *my_array = &lt;double *&gt; malloc(number * sizeof(double)) if not my_array: raise MemoryError() try: ran = random.normalvariate for i in range(number): my_array[i] = ran(0, 1) # ... let's just assume we do some more heavy C calculations here to make up # for the work that it takes to pack the C double values into Python float # objects below, right after throwing away the existing objects above. return [x for x in my_array[:number]] finally: # return the previously allocated memory to the system free(my_array) ``` | 請注意,用于在 Python 堆上分配內存的 C-API 函數通常比上面的低級 C 函數更受歡迎,因為它們提供的內存實際上是在 Python 的內部內存管理系統中考慮的。它們還對較小的內存塊進行了特殊優化,通過避免代價高昂的操作系統調用來加速其分配。 可以在`cpython.mem`標準聲明文件中找到 C-API 函數: ```py from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free ``` 它們的接口和用法與相應的低級 C 函數相同。 需要記住的一件重要事情是,`malloc()`或 [`PyMem_Malloc()`](https://docs.python.org/3/c-api/memory.html#c.PyMem_Malloc "(in Python v3.7)") _ 獲得的內存塊必須手動釋放 _,并相應調用`free()`或 [`PyMem_Free()`](https://docs.python.org/3/c-api/memory.html#c.PyMem_Free "(in Python v3.7)") 當它們不再使用時(_ 必須 _ 總是使用匹配類型的自由函數)。否則,在 python 進程退出之前,它們不會被回收。這稱為內存泄漏。 如果一塊內存需要比`try..finally`塊可以管理的更長的生命周期,另一個有用的習慣是將其生命周期與 Python 對象聯系起來以利用 Python 運行時的內存管理,例如: ```py from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free cdef class SomeMemory: cdef double* data def __cinit__(self, size_t number): # allocate some memory (uninitialised, may contain arbitrary data) self.data = <double*> PyMem_Malloc(number * sizeof(double)) if not self.data: raise MemoryError() def resize(self, size_t new_number): # Allocates new_number * sizeof(double) bytes, # preserving the current content and making a best-effort to # re-use the original data location. mem = <double*> PyMem_Realloc(self.data, new_number * sizeof(double)) if not mem: raise MemoryError() # Only overwrite the pointer if the memory was really reallocated. # On error (mem is NULL), the originally memory has not been freed. self.data = mem def __dealloc__(self): PyMem_Free(self.data) # no-op if self.data is NULL ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看