2013-07-05 51 views
4

我對Python中的術語'buffer Interface'非常困惑。這是什麼意思,說「一個暴露其底層內存結構的python對象」可以用一個例子來解釋。在此先感謝關於python中的緩衝區接口

回答

3

「底層內存結構」指構成計算機內存中對象的八位組序列。例如,當您創建字符串​​時,Python必須至少保留3個字節的內存並存儲字母a,bc。如果內存是連續的(如字符串的情況),則其地址和大小可以是傳遞給想要檢查它的任何一段C代碼,而不經過Python str類型的開銷。

一個有用的示例是array類型。數組是一個非常類似於Python列表的序列,不同之處在於它包含單一類型的元素 - 您可以有一個int數組和一個浮點數組,但不能混合這兩個元素。好處是數組儘可能高效地打包數據,並將它們存儲在一個平面C數組中。該數組通過緩衝區接口暴露 - 它允許查詢底層C數組的確切內存位置和大小,並將其傳遞給某些C函數,該函數將有效地初始化它或將其寫入磁盤。 numpy數字包是圍繞Python和C(甚至FORTRAN)之間的這種數據共享構建的,爲此它們擴展了緩衝區協議,其中一些擴展使其成爲Python 3.

對象mmap提供了一個用於OS級內存映射功能的Python接口,還提供了一個緩衝接口。這使得必須有效訪問存儲器的C代碼(例如re模塊)也可用於內存映射區域。

+0

這是否意味着說每個python對象都有一個等效的C表示,由python解釋器用於處理。我們可以訪問支持緩衝接口的對象的C表示。 – user634615

+2

@ user634615每個Python對象都必須以某種方式在內存中表示,並且由於CPython在C中實現,因此表示形式最終基於C的數據類型。在某些情況下(數組),在Python之外公開這種表示是可能的和有用的。在其他情況下,這或者是無用的(就像列表一樣,它們是內部Python對象內部指針的數組),或者完全不可能(就像內部哈希表一樣,這些內部哈希表具有相當複雜的結構,因此不能表示爲單個「緩衝」)。 – user4815162342

+0

另請參見[Guido的此解釋](http://mail.python.org/pipermail/python-dev/2000-October/009974.html)。 – user4815162342