2

私は次のようなことをすることができます

initialValue = 0x42
width = 113
someBytes = bytes([initialValue] * width)

ただし、これは、中間リストを破棄するためだけに作成するのに時間を浪費します。

また

someBytes = bytearray(width)
for n in range(width):
  someBytes[n] = initialValue

しかし、それは非常に機能的ではなく、ゼロの初期値で始まります。これはすぐに置き換えられます。割り当てを機能させるには、バイト配列を使用する必要があります。

これを達成するためのより多くのpython/simple / terse方法はありますか?

(python3ところで)

ファローアップ:

私はこのbytes([initialValue]) * widthアプローチを使用することになりました。「明白ではない」唯一のことは、短命の状態の通常のリストを使用して初期値を持つバイト配列を作成する必要があることだと思いますが、それは幅の割り当てとは無関係であり、他のいくつかと一致していますPythonコレクション。

面白いタイミングでやりました。引き伸ばされたバイトは、引き伸ばされたリストから作成されたバイトよりも高速であることが期待されます。

>>> timeit("bytes([initial]) * width",
...  "width = 256; initial = 0x42", number=100000)
0.11861954815685749

vs

>>> timeit("bytes([initial] * width)",
...   "width = 256; initial = 0x42", number=100000)
0.5535310138948262

のサイズがwidth大きくなるにつれて、違いはますます顕著になります。私が試したもう1つの興味深いアプローチは、理解力を使って作成することでした。私はこれがどれほど遅いか驚いた:

>>> timeit("bytes(initial for _ in range(width))",
...   "width = 256; initial = 0x42", number=100000)
2.3924577180296183

幅が広がるにつれて、これは本当にオリジナルから離れて広がりました。私のinitialValueはプログラムで決定されたため、そのアプローチを使用する立場にはありませんでしたが、その速度は実際には非常に高速であり、リストから1要素バイトを作成するオーバーヘッドが非常に大きいことに少し驚いていました。

>>> timeit("b'\x42' * width",
...   "width = 256; initial = 0x42", number=100000)
0.010320456698536873

これは、他の方法では高速ですが、文字通りではないソリューションよりも完全に10倍高速です。

4

1 に答える 1

5

を作成した後、乗算を行うだけですbytes

bytes([initialValue])*width
于 2013-01-05T04:15:12.463 に答える