2021-03-28に投稿

Python メモリビュー型 memoryview

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
Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント