Python メモリビュー型 memoryview
Publish date: 2021-03-25
Last updated: 2021-03-25
Last updated: 2021-03-25
bytes や bytearray など バッファプロトコル をサポートするオブジェクトの内部データに直接アクセスするのに使用できるクラスです。
memoryviewの定義
memoryview(対象のオブジェクト)
でmemoryviewを作成できる。
b = b"abcdefghijk"
mv = memoryview(b)
mv[3] # => 100
bytes(mv[3:6]) # => b'def'
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv[3] # => 100
bytes(mv[3:6]) # => b'def'
memoryviewの書き換え
参照しているオブジェクトが書き換え可能な場合、同じサイズの代入ができる。
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False
mv[3] = 88
mv[4:6] = b"YZ"
mv.tobytes() # => b'abcXYZghijk
イミュータブルなオブジェクトを参照している場合は書き換えできない。
b = b"abcdefghijk"
mv = memoryview(b)
mv.readonly # => True
mv[3] = 88 # => TypeError: cannot modify read-only memory
memoryviewのメソッド
tobytes(order=None) バイト文字列
b = b"abcdefghijk"
mv = memoryview(b)
mv.tobytes() # => b'abcdefghijk'
hex([sep[, bytes_per_sep]]) 16進数文字列
b = b"abcdefghijk"
mv = memoryview(b)
mv.hex() # => '6162636465666768696a6b'
mv.hex("-") # => '61-62-63-64-65-66-67-68-69-6a-6b'
mv.hex("-", 4) # => '616263-64656667-68696a6b'
tolist() 要素のリスト
b = b"abcdefghijk"
mv = memoryview(b)
mv.tolist() # => [97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107]
toreadonly() 読み取り専用のメモリービュー
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False
mv[3] = 88
mv[4:6] = b"YZ"
mv.tobytes() # => b'abcXYZghijk
mv_readonly = mv.toreadonly()
mv_readonly[3] = 88 # => TypeError: cannot modify read-only memory
release() 開放
b = b"abcdefghijk"
mv = memoryview(b)
mv.release()
withで開放を忘れずに行える。
with memoryview(b) as mv:
print(mv[1])
obj memoryview が参照しているオブジェクト
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.obj == b"abcdefghijk" # => True
readonly 読み取り専用プリパティ
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False
b = b"abcdefghijk"
mv = memoryview(b)
mv.readonly # => True