これらのバッファモジュールの違いをグーグルで検索し、SOでも検索しました。しかし、私はまだよく理解していません。私が読んだ記事のいくつかは古くなっていると思います。
Python 2.7.11 では、特定の形式のバイナリ ファイルを を使用してダウンロードしましたr = requests.get(url)
。次に、コンテンツを解析するために設計された関数にStringIO.StringIO(r.content)
, cStringIO.StringIO(r.content)
andを渡しました。io.BytesIO(r.content)
これら 3 つの方法はすべて利用可能です。つまり、ファイルがバイナリであっても、StringIO
. なんで?
もう1つのことは、それらの効率に関するものです。
In [1]: import StringIO, cStringIO, io
In [2]: from numpy import random
In [3]: x = random.random(1000000)
In [4]: %timeit y = cStringIO.StringIO(x)
1000000 loops, best of 3: 736 ns per loop
In [5]: %timeit y = StringIO.StringIO(x)
1000 loops, best of 3: 283 µs per loop
In [6]: %timeit y = io.BytesIO(x)
1000 loops, best of 3: 1.26 ms per loop
上図のように、cStringIO > StringIO > BytesIO
.
io.BytesIO
常に新しいコピーを作成するため、より多くの時間がかかると誰かが言及しているのを見つけました。しかし、これが後の Python バージョンで修正されたという投稿もいくつかあります。
IO
では、最新の Python 2.x と 3.x の両方で、これらの s を完全に比較できる人はいますか?
私が見つけた参照の一部:
- https://trac.edgewall.org/ticket/12046
io.StringIO には Unicode 文字列が必要です。io.BytesIO にはバイト文字列が必要です。StringIO.StringIO は、Unicode またはバイト文字列のいずれかを許可します。cStringIO.StringIO には、バイト文字列としてエンコードされた文字列が必要です。
しかしcStringIO.StringIO('abc')
、エラーは発生しません。
https://review.openstack.org/#/c/286926/1
StringIO クラスは、特にサブユニット v2 がバイナリで文字列ではないことを考えると、これに使用するクラスとしては不適切です。
http://comments.gmane.org/gmane.comp.python.devel/148717
cStringIO.StringIO(b'data') はデータをコピーしませんでしたが、io.BytesIO(b'data') はコピーを作成します (データが後で変更されていない場合でも)。
この投稿には 2014 年の修正パッチがあります。
- ここにリストされていないSOの投稿がたくさんあります。
Eric の例の Python 2.7 の結果は次のとおりです。
%timeit cStringIO.StringIO(u_data)
1000000 loops, best of 3: 488 ns per loop
%timeit cStringIO.StringIO(b_data)
1000000 loops, best of 3: 448 ns per loop
%timeit StringIO.StringIO(u_data)
1000000 loops, best of 3: 1.15 µs per loop
%timeit StringIO.StringIO(b_data)
1000000 loops, best of 3: 1.19 µs per loop
%timeit io.StringIO(u_data)
1000 loops, best of 3: 304 µs per loop
# %timeit io.StringIO(b_data)
# error
# %timeit io.BytesIO(u_data)
# error
%timeit io.BytesIO(b_data)
10000 loops, best of 3: 77.5 µs per loop
2.7 に関しては、cStringIO.StringIO
とStringIO.StringIO
は よりもはるかに効率的ですio
。