Python noob,强大的c背景。
我正在编写一个简单的服务器,它从套接字中读取大小为1024字节的块。我需要将块连接成一个大文件(它是一个视频)。对于初学者我尝试了类似的东西
movie = bytearray()
while numblocksrxd != numBlocks:
data=conn.recv(1024)
numblocksrxd+=1
movie = movie+data
我很快意识到这个代码每次分配给它时都会创建一个movie
的新实例,这会随着它的增长而产生越来越大的mem副本(我认为)。如果我在C中这样做,我只需要将我需要的空间进行malloc并将其填入。我如何在python中处理这个?
答案 0 :(得分:4)
movie += data
如果目标是可变的,则通常在不创建新对象的情况下完成增强分配。在这种情况下,bytearray
支持就地+=
,因此此代码不会创建新对象。当bytearray的内部缓冲区空间不足时,它将分配一个新的,但分配采用摊销的常量时间,管理缓冲区的movie
对象不会被替换。
答案 1 :(得分:1)
我怀疑你真的需要更多的效率,而不仅仅是追加像这样的字节串。是的,它将重新分配数组并复制它,但它使用通常的指数扩展技巧,因此摊销时间仍然是恒定的。
如果你真的需要更高的效率(我怀疑你这样做,但是......),你可以只存储一个list
字节字符串而不是一个大字节字符串。如果你可以按原样使用,那很好。如果没有,您可以在最后使用join
将它们连接起来。这几乎总是在Python中构建大字符串的最快方法。所以:
movie = []
while numblocksrxd != numBlocks:
data=conn.recv(1024)
numblocksrxd+=1
movie.append(data)
movie = b''.join(movie)
或者你可以使用你在C中使用的相同技巧:
movie = bytearray(numBlocks * 1024)
while numblocksrxd != numBlocks:
data=conn.recv(1024)
numblocksrxd+=1
movie[numblocksrxd*1024:(numblocksrxd+1)*1024] = data