0

データを受け入れるように設計されたこのコルーチンがあり、チェーン内の次のコルーチンにデータを送信しますが、長さのブロックですblocksize。文字列は不変であるため、追加するたびに新しい文字列オブジェクトが作成されるため、私が行っている文字列の追加はかなり非効率的だと思います。

これは、これらのチェーンの適切な作業の間の「接着剤」にすぎないため、できるだけ滑らかにできるとよいでしょう。

def chunker(target, blocksize=DEFAULT_BLOCK_SIZE):
    buffer = ""
    target_send = target.send
    while True:
        try:
            input_data = yield
            buffer += input_data  # creates new string object every time
            buffer_len = len(buffer)
            if buffer_len >= blocksize:
                chunks, leftover = divmod(buffer_len, blocksize)
                for i in xrange(0, chunks*blocksize, blocksize):
                    target_send(buffer[i:i+blocksize])
                buffer = buffer[-leftover:] if leftover else ""
        except CleanUp:
            if buffer:
                target_send(buffer)
            target_send("")

どうすればこれを改善できますか? または、これを達成するためのより簡単な方法はありますか?

4

1 に答える 1

2

1つのオプションは、各チャンクのリストを維持し、''.join()到達したときにそれらを維持することですblocksize。これは、文字列の連結よりも効率的です。例(未テスト):

def chunker(target, blocksize=DEFAULT_BLOCK_SIZE):
    data = []
    buffer = ''
    buffer_len = 0
    target_send = target.send
    while True:
        try:
            input_data = yield
            data.append(input_data)
            buffer_len += len(input_data)
            if buffer_len >= blocksize:
                buffer = ''.join(data)
                chunks, leftover = divmod(buffer_len, blocksize)
                for i in xrange(0, chunks*blocksize, blocksize):
                    target_send(buffer[i:i+blocksize])
                buffer = buffer[-leftover:] if leftover else ""
                buffer_len = len(buffer)
                data = [buffer] if buffer else []
        except CleanUp:
            buffer = ''.join(data)
            if buffer:
                target_send(buffer)
            target_send("")
于 2012-12-12T19:45:42.403 に答える