如何着手改进这个合作项目

2024-09-28 22:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个共同例程,它被设计为接受数据,然后将数据发送到链中的下一个共同例程,但以长度为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("")

我该如何改进?或者更好,有没有更简单的方法来实现这一点?你知道吗


Tags: 数据对象字符串sendtargetinputdatalen
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:12

一种方法是维护每个块的列表,然后在到达blocksize''.join()它们,这应该比字符串串联更有效。例如(未测试):

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("")

相关问题 更多 >