摘要:對于更高的維度,其長度等于表示的嵌套列表的長度。這是數(shù)組在連續(xù)表示時(shí)將會占用的空間總字節(jié)數(shù)。該值僅作為參考信息。新版功能一個(gè)表明內(nèi)存是否為的布爾值。新版功能上一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型二進(jìn)制序列類型下一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型集合類型映射類型
上一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytearray)內(nèi)存視圖
下一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型
memoryview 對象允許 Python 代碼訪問一個(gè)對象的內(nèi)部數(shù)據(jù),只要該對象支持 緩沖區(qū)協(xié)議 而無需進(jìn)行拷貝。
class memoryview(obj)創(chuàng)建一個(gè)引用 obj 的 memoryview。 obj 必須支持緩沖區(qū)協(xié)議。 支持緩沖區(qū)協(xié)議的內(nèi)置對象包括 bytes 和 bytearray。
memoryview 具有 元素 的概念,即由原始對象 obj 所處理的基本內(nèi)存單元。 對于許多簡單類型例如 bytes 和 bytearray 來說,一個(gè)元素就是一個(gè)字節(jié),但是其他的類型例如 array.array 可能有更大的元素。
len(view) 與 tolist 的長度相等。 如果 view.ndim = 0,則其長度為 1。 如果 view.ndim = 1,則其長度等于 view 中元素的數(shù)量。 對于更高的維度,其長度等于表示 view 的嵌套列表的長度。 itemsize 屬性可向你給出單個(gè)元素所占的字節(jié)數(shù)。
memoryview 支持通過切片和索引訪問其元素。 一維切片的結(jié)果將是一個(gè)子視圖:
>>> v = memoryview(b"abcefg") >>> v[1] 98 >>> v[-1] 103 >>> v[1:4]>>> bytes(v[1:4]) b"bce"
如果 format 是一個(gè)來自于 struct 模塊的原生格式說明符,則也支持使用整數(shù)或由整數(shù)構(gòu)成的元組進(jìn)行索引,并返回具有正確類型的單個(gè) 元素。 一維內(nèi)存視圖可以使用一個(gè)整數(shù)或由一個(gè)整數(shù)構(gòu)成的元組進(jìn)行索引。 多維內(nèi)存視圖可以使用由恰好 ndim 個(gè)整數(shù)構(gòu)成的元素進(jìn)行索引,ndim 即其維度。 零維內(nèi)存視圖可以使用空元組進(jìn)行索引。
這里是一個(gè)使用非字節(jié)格式的例子:
>>> import array >>> a = array.array("l", [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]
如果下層對象是可寫的,則內(nèi)存視圖支持一維切片賦值。 改變大小則不被允許:
>>> data = bytearray(b"abcefg") >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b"z") >>> data bytearray(b"zbcefg") >>> v[1:4] = b"123" >>> data bytearray(b"z123fg") >>> v[2:3] = b"spam" Traceback (most recent call last): File "", line 1, in ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b"spam" >>> data bytearray(b"z1spam")
由帶有格式符號 "B", "b" 或 "c" 的可哈希(只讀)類型構(gòu)成的一維內(nèi)存視圖同樣是可哈希的。 哈希定義為 hash(m) == hash(m.tobytes()):
>>> v = memoryview(b"abcefg") >>> hash(v) == hash(b"abcefg") True >>> hash(v[2:4]) == hash(b"ce") True >>> hash(v[::-2]) == hash(b"abcefg"[::-2]) True
在 3.3 版更改: 一維內(nèi)存視圖現(xiàn)在可以被切片。 帶有格式符號 "B", "b" 或 "c" 的一維內(nèi)存視圖現(xiàn)在是可哈希的。
在 3.4 版更改: 內(nèi)存視圖現(xiàn)在會自動注冊為 collections.abc.Sequence
在 3.5 版更改: 內(nèi)存視圖現(xiàn)在可使用整數(shù)元組進(jìn)行索引。
memoryview 具有以下一些方法:
__eq__(exporter)memoryview 與 PEP 3118 中的導(dǎo)出器這兩者如果形狀相同,并且如果當(dāng)使用 struct 語法解讀操作數(shù)的相應(yīng)格式代碼時(shí)所有對應(yīng)值都相同,則它們就是等價(jià)的。
對于 tolist() 當(dāng)前所支持的 struct 格式字符串子集,如果 v.tolist() == w.tolist() 則 v 和 w 相等:
>>> import array >>> a = array.array("I", [1, 2, 3, 4, 5]) >>> b = array.array("d", [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array("b", [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() True
如果兩邊的格式字符串都不被 struct 模塊所支持,則兩對象比較結(jié)果總是不相等(即使格式字符串和緩沖區(qū)內(nèi)容相同):
>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b False
請注意,與浮點(diǎn)數(shù)的情況一樣,對于內(nèi)存視圖對象來說,v is w 也 并不 意味著 v == w。
在 3.3 版更改: 之前的版本比較原始內(nèi)存時(shí)會忽略條目的格式與邏輯數(shù)組結(jié)構(gòu)。
tobytes()將緩沖區(qū)中的數(shù)據(jù)作為字節(jié)串返回。 這相當(dāng)于在內(nèi)存視圖上調(diào)用 bytes 構(gòu)造器。
>>> m = memoryview(b"abc") >>> m.tobytes() b"abc" >>> bytes(m) b"abc"
對于非連續(xù)數(shù)組,結(jié)果等于平面化表示的列表,其中所有元素都轉(zhuǎn)換為字節(jié)串。 tobytes() 支持所有格式字符串,不符合 struct 模塊語法的那些也包括在內(nèi)。
hex()返回一個(gè)字符串對象,其中分別以兩個(gè)十六進(jìn)制數(shù)碼表示緩沖區(qū)里的每個(gè)字節(jié)。
>>> m = memoryview(b"abc") >>> m.hex() "616263"
3.5 新版功能.
tolist()將緩沖區(qū)內(nèi)的數(shù)據(jù)以一個(gè)元素列表的形式返回。
>>> memoryview(b"abc").tolist() [97, 98, 99] >>> import array >>> a = array.array("d", [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
在 3.3 版更改: tolist() 現(xiàn)在支持 struct 模塊語法中的所有單字符原生格式以及多維表示形式。
release()釋放由內(nèi)存視圖對象所公開的底層緩沖區(qū)。 許多對象在被視圖所獲取時(shí)都會采取特殊動作(例如,bytearray 將會暫時(shí)禁止調(diào)整大小);因此,調(diào)用 release() 可以方便地盡早去除這些限制(并釋放任何多余的資源)。
在此方法被調(diào)用后,任何對視圖的進(jìn)一步操作將引發(fā) ValueError (release() 本身除外,它可以被多次調(diào)用):
>>> m = memoryview(b"abc") >>> m.release() >>> m[0] Traceback (most recent call last): File "", line 1, in ValueError: operation forbidden on released memoryview object 使用 with 語句,可以通過上下文管理協(xié)議達(dá)到類似的效果: >>> >>> with memoryview(b"abc") as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File " ", line 1, in ValueError: operation forbidden on released memoryview object
3.2 新版功能.
cast(format[, shape])將內(nèi)存視圖轉(zhuǎn)化為新的格式或形狀。 shape 默認(rèn)為 [byte_length//new_itemsize],這意味著結(jié)果視圖將是一維的。 返回值是一個(gè)新的內(nèi)存視圖,但緩沖區(qū)本身不會被復(fù)制。 支持的轉(zhuǎn)化有 1D -> C-contiguous 和 C-contiguous -> 1D。
目標(biāo)格式僅限于 struct 語法中的單一元素原生格式。 其中一種格式必須為字節(jié)格式 ("B", "b" 或 "c")。 結(jié)果的字節(jié)長度必須與原始長度相同。
將 1D/long 轉(zhuǎn)換為 1D/unsigned bytes:
>>> import array >>> a = array.array("l", [1,2,3]) >>> x = memoryview(a) >>> x.format "l" >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast("B") >>> y.format "B" >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24
將 1D/unsigned bytes 轉(zhuǎn)換為 1D/char:
>>> b = bytearray(b"zyz") >>> x = memoryview(b) >>> x[0] = b"a" Traceback (most recent call last): File "", line 1, in ValueError: memoryview: invalid value for format "B" >>> y = x.cast("c") >>> y[0] = b"a" >>> b bytearray(b"ayz")
將 1D/bytes 轉(zhuǎn)換為 3D/ints 再轉(zhuǎn)換為 1D/signed char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast("i", shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format "i" >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast("b") >>> z.format "b" >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48
將 1D/unsigned char 轉(zhuǎn)換為 2D/unsigned long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast("L", shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]
3.3 新版功能.
在 3.5 版更改: 當(dāng)轉(zhuǎn)換為字節(jié)視圖時(shí),源格式將不再受限。
還存在一些可用的只讀屬性:
obj內(nèi)存視圖的下層對象:
>>> b = bytearray(b"xyz") >>> m = memoryview(b) >>> m.obj is b True
3.3 新版功能.
nbytesnbytes == product(shape) * itemsize == len(m.tobytes())。 這是數(shù)組在連續(xù)表示時(shí)將會占用的空間總字節(jié)數(shù)。 它不一定等于 len(m):
>>> import array >>> a = array.array("i", [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12
多維數(shù)組:
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast("d", shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96
3.3 新版功能.
readonly一個(gè)表明內(nèi)存是否只讀的布爾值。
format一個(gè)字符串,包含視圖中每個(gè)元素的格式(表示為 struct 模塊樣式)。 內(nèi)存視圖可以從具有任意格式字符串的導(dǎo)出器創(chuàng)建,但某些方法 (例如 tolist()) 僅限于原生的單元素格式。
在 3.3 版更改: 格式 "B" 現(xiàn)在會按照 struct 模塊語法來處理。 這意味著 memoryview(b"abc")[0] == b"abc"[0] == 97。
itemsizememoryview 中每個(gè)元素以字節(jié)表示的大小:
>>> import array, struct >>> m = memoryview(array.array("H", [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize("H") == m.itemsize Truendim
一個(gè)整數(shù),表示內(nèi)存所代表的多維數(shù)組具有多少個(gè)維度。
### shape
一個(gè)整數(shù)元組,通過 ndim 的長度值給出內(nèi)存所代表的 N 維數(shù)組的形狀。
在 3.3 版更改: 當(dāng) ndim = 0 時(shí)值為空元組而不再為 None。
strides一個(gè)整數(shù)元組,通過 ndim 的長度給出以字節(jié)表示的大小,以便訪問數(shù)組中每個(gè)維度上的每個(gè)元素。
在 3.3 版更改: 當(dāng) ndim = 0 時(shí)值為空元組而不再為 None。
suboffsets供 PIL 風(fēng)格的數(shù)組內(nèi)部使用。 該值僅作為參考信息。
c_contiguous一個(gè)表明內(nèi)存是否為 C-contiguous 的布爾值。
3.3 新版功能.
f_contiguous一個(gè)表明內(nèi)存是否為 Fortran contiguous 的布爾值。 3.3 新版功能.contiguous
一個(gè)表明內(nèi)存是否為 contiguous 的布爾值。
3.3 新版功能.
上一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytearray)
下一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44001.html
摘要:第行把具名元組以的形式返回。對序列使用和通常號兩側(cè)的序列由相同類型的數(shù)據(jù)所構(gòu)成當(dāng)然不同類型的也可以相加,返回一個(gè)新序列。從上面的結(jié)果可以看出,它雖拋出了異常,但仍完成了操作查看字節(jié)碼并不難,而且它對我們了解代碼背后的運(yùn)行機(jī)制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關(guān)于Python的數(shù)據(jù)結(jié)構(gòu),本篇主要是Python中的各序列類型 1. 內(nèi)置序列類型概覽 Python標(biāo)準(zhǔn)庫...
摘要:目前有兩種內(nèi)置集合類型,和。兩個(gè)類的構(gòu)造器具有相同的作用方式返回一個(gè)新的或?qū)ο螅湓貋碜杂凇R硎居杉蠈ο髽?gòu)成的集合,所有的內(nèi)層集合必須為對象。目前僅有一種標(biāo)準(zhǔn)映射類型字典。 上一篇文章:Python標(biāo)準(zhǔn)庫---14、內(nèi)置類型:二進(jìn)制序列類型 (memoryview)下一篇文章:Python標(biāo)準(zhǔn)庫---16、內(nèi)置類型:上下文管理器類型、其他、特殊屬性 集合類型 --- set, ...
摘要:上一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型迭代器類型序列類型下一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型二進(jìn)制序列類型文本序列類型在中處理文本數(shù)據(jù)是使用對象,也稱為字符串。正式的定義為十進(jìn)制數(shù)字符就是一般分類中的字符。 上一篇文章:Python標(biāo)準(zhǔn)庫---11、內(nèi)置類型:迭代器類型、序列類型(list-typle-range)下一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytear...
摘要:以便于用戶理解的方式返回對象的字符串表示形式。函數(shù)會調(diào)用函數(shù),對來說,輸出的是一個(gè)有序?qū)Α4送猓€有用于支持內(nèi)置的構(gòu)造函數(shù)的方法。可散列實(shí)現(xiàn)了方法,使用推薦的異或運(yùn)算符計(jì)算實(shí)例屬性的散列值私有屬性最好用命名規(guī)則來實(shí)現(xiàn)這種方式有好有壞 絕對不要使用兩個(gè)前導(dǎo)下劃線,這是很煩人的自私行為。——Ian Bicking 對象表示形式 repr() 以便于開發(fā)者理解的方式返回對象的字符串表示形式...
摘要:流暢的中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用標(biāo)準(zhǔn)庫。常見的扁平序列包括,,等。數(shù)組支持所有跟可變序列有關(guān)的操作,包括和。和用于指定列表的區(qū)間,默認(rèn)是使用整個(gè)列表。但是元組的賦值不被允許,當(dāng)異發(fā)生時(shí) 流暢的python中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用Python 標(biāo)準(zhǔn)庫。介紹了很多python的不常用的數(shù)據(jù)類型、操作、庫等,對于入門python后想要提升對p...
閱讀 2079·2023-04-25 21:11
閱讀 2968·2021-09-30 09:47
閱讀 2280·2021-09-24 09:48
閱讀 4438·2021-08-23 09:43
閱讀 900·2019-08-30 15:54
閱讀 567·2019-08-28 18:01
閱讀 1404·2019-08-27 10:55
閱讀 594·2019-08-27 10:55