3

最近、Python (子供の頃に GW BASIC を使用して以来、初めてのプログラミング言語) の学習を開始しました。バイトオブジェクトにバイトを追加するとき、各バイトの追加には最後のバイトよりも時間がかかることに気付きました。対照的に、整数をリスト オブジェクトに追加する場合、各整数の追加には最後の整数と同じ時間がかかります。次のプログラムはそれを示しています。

import time
import struct
time.clock() # for Windows

def time_list():
    print("adding 9,999,999 0s to one list 9 times:")
    a = []
    for i in range(9):
        start_time = time.clock()
        for j in range(9999999):
            a += [0]
        end_time = time.clock()
        print("loop %d took %f seconds" %(i, end_time - start_time))
    print()

def time_bytes_object():
    print("adding 99,999 pad bytes to a bytes object 9 times:")
    a = bytes()
    for i in range(9):
        start_time = time.clock()
        for j in range(99999):
            a += struct.pack('<B', 0)
        end_time = time.clock()
        print("loop %d took %f seconds" %(i, end_time - start_time))
    print()

time_list()
time_bytes_object()

bytes オブジェクト (または struct.pack 関数) が原因で、バイトの追加に時間がかかるのはなぜですか? または、私の例で使用されている方法よりも高速に大量のバイトを収集する方法はありますか?

助けてくれてありがとう、

ビクター

4

4 に答える 4

6

Python のバイト文字列 (および Unicode 文字列) は不変ですが、リストは変更可能です。

これが意味することは、バイト文字列に対して行われるすべての追加 ( +=) は、その文字列のコピーを作成する必要があるということです。オリジナルは変更されません (ただし、後でガベージ コレクションされます)。対照的に、( によっても使用される) のappendメソッドは、実際にリストを変更します。list+=

必要なのはbytearray型です。これは、バイトのリストのように機能する可変型です。追加にbytearrayは (償却された) 一定の時間がかかり、バイト文字列との間で簡単に変換されます。

于 2012-09-10T20:51:42.587 に答える
2

オブジェクトは、文字列と同じようにbytes不変です。を実行するたびa += somethingに、Python は新しいオブジェクトを作成し、そこにコピーa + somethingしてから に割り当てaます。

変更可能なシーケンスであり、メソッドをサポートするbytearray型を使用することをお勧めします。append

于 2012-09-10T20:52:39.707 に答える