このような場合に無意味なスライスのコピーを避けるための一般的なイディオムはありますか?
>>> a = bytearray(b'hello')
>>> b = bytearray(b'goodbye, cruel world.')
>>> a.extend(b[14:20])
>>> a
bytearray(b'hello world')
b[14:20]
スライスの作成時に不要なコピーが発生しているようです。メモリ内に新しいスライスを作成して与えるextend
のではなく、「現在のオブジェクトのこの範囲のみを使用する」と言いたいです。
いくつかのメソッドは、スライス パラメーターを使用するのに役立ちます。たとえば、次のようになりますcount
。
>>> a = bytearray(1000000) # a million zero bytes
>>> a[0:900000].count(b'\x00') # expensive temporary slice
900000
>>> a.count(b'\x00', 0, 900000) # helpful start and end parameters
900000
しかし、最初の例のように、多くのextend
場合、この機能はありません。
多くのアプリケーションでは、私が話しているのはマイクロ最適化であることを認識しているので、誰かが尋ねる前に - はい、アプリケーションのプロファイルを作成しました。私の場合は心配する価値があります。
以下に1つの「解決策」がありますが、より良いアイデアは大歓迎です。