15

私はいくつかのソケット IO を実行しており、bytearray オブジェクトをバッファとして使用しています。中間文字列オブジェクトの作成を避けるために、以下に示すように csock.recv_into を使用して、このバッファーへのオフセットを持つデータを受信したいと考えています。残念ながら、バイト配列はこの方法では使用できないようで、以下のコードは機能しません。

buf    = bytearray(b" " * toread)
read   = 0
while(toread):
  nbytes = csock.recv_into(buf[read:],toread)
  toread -= nbytes
  read   += nbytes

代わりに、一時的な文字列を使用する(そして機能する)以下のコードを使用しています...

buf    = bytearray(b" " * toread)
read   = 0
while(toread):
  tmp = csock.recv(toread)
  nbytes = len(tmp)
  buf[read:] = tmp
  toread -= nbytes
  read   += nbytes

中間文字列をコピーする必要のない、これを行うためのよりエレガントな方法はありますか?

4

1 に答える 1

29

a を使用しmemoryviewてラップしますbytearray:

buf = bytearray(toread)
view = memoryview(buf)
while toread:
    nbytes = sock.recv_into(view, toread)
    view = view[nbytes:] # slicing views is cheap
    toread -= nbytes
于 2013-04-12T06:25:20.040 に答える