Pythonバッファタイプとは何ですか?


136

bufferPythonにはタイプがありますが、それをどのように使用できるかわかりません。

ではPythonのドキュメントの記述は以下のとおりです。

buffer(object[, offset[, size]])

オブジェクト引数は、バッファー呼び出しインターフェース(ストリング、配列、バッファーなど)をサポートするオブジェクトでなければなりません。オブジェクトの引数を参照する新しいバッファオブジェクトが作成されます。バッファオブジェクトは、オブジェクトの先頭から(または指定されたオフセットから)スライスになります。スライスはオブジェクトの終わりまで拡張されます(または、サイズ引数で指定された長さになります)。

回答:


145

使用例:

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

この場合のバッファーは、位置6から始まり長さ5のサブストリングであり、余分なストレージ領域を必要としません-ストリングのスライスを参照します。

これは、このような短い文字列にはあまり役立ちませんが、大量のデータを使用するときに必要になる場合があります。この例ではmutableを使用していbytearrayます。

>>> s = bytearray(1000000)   # a million zeroed bytes
>>> t = buffer(s, 1)         # slice cuts off the first byte
>>> s[1] = 5                 # set the second element in s
>>> t[0]                     # which is now also the first element in t!
'\x05'

これは、データの複数のビューが必要で、メモリに複数のコピーを保持したくない(または保持できない)場合に非常に役立ちます。

buffer良くという名前に置き換えられていmemoryviewますが、Pythonの2.7のいずれかで使用できますが、Pythonの3に。

また、C APIを掘り下げることなく、独自のオブジェクトのバッファーインターフェイスを実装することはできません。つまり、純粋なPythonでは実行できません。


ご説明ありがとうございます。しかし、バッファリングと単純なスライスの違いはまだよくわかりません。を使用s[6:11]しても余分なストレージ容量は必要ありません、私は間違っていますか?
satoru

9
一般に、スライスは追加のストレージを必要とするため、はいs[6:11]はコピーになります。設定してt = s[6:11]からを実行すると、del sによって取得されたメモリが解放されstコピーされたことが証明されます。(これを表示するには、より大きくs、Pythonのメモリ使用量を追跡する必要があります)。ただし、関連するデータがあまりない場合は、コピーを作成する方がはるかに効率的です。
スコットグリフィス

1
どうもありがとうございました:)ところで、Pythonのメモリ使用量を追跡するために使用できるツールを教えてください。
satoru 2010

メモリ使用量については、たとえば、stackoverflow.com / questions / 110259を参照してください。タスクマネージャー/アクティビティモニター/トップでPythonの使用状況を確認するのが最も簡単な場合があります。
スコットグリフィス

13
私のようなPython初心者の場合:バッファはPython 3のメモリビューです
Dirk Bester

25

バッファは、Pythonをネイティブライブラリに接続する場合などに役立ちます。(Guido van Rossum bufferこのメーリングリストの投稿で説明しています)。

たとえば、numpyは効率的なデータストレージのためにバッファを使用しているようです:

import numpy
a = numpy.ndarray(1000000)

これa.dataは:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.