男孩,我是不是不了解python的传递引用问题...我创建了一个非常有用的“ unpacker”类,我将其传递给需要从中解压缩的各种对象,但是考虑到它的速度非常慢,我可以告诉我每次传递BU对象时都在复制binaryStr。我知道这是因为,如果我将BU分成较小的块,它的运行速度实际上快了100倍(我本来是用它来保存16MB文件I / O缓冲区的)
所以我的问题是,为什么该成员不通过引用而通过,并且有一种方法可以迫使它通过?我很确定BU对象本身是通过引用传递的(因为我的代码有效),但是速度表明.binaryStr对象已被复制。我还缺少一些更微妙的东西吗?
class BinaryUnpacker(object):
def __init__(self, binaryStr):
self.binaryStr = binaryStr
self.pos = 0
def get(self, varType, sz=0):
pos = self.pos
if varType == UINT32:
value = unpack('<I', self.binaryStr[pos:pos+4])[0]
self.pos += 4
return value
elif varType == UINT64:
value = unpack('<Q', self.binaryStr[pos:pos+8])[0]
self.pos += 8
return value
elif varType == VAR_INT:
[value, nBytes] = unpackVarInt(self.binaryStr[pos:])
self.pos += nBytes
....
用例如下:
def unserialize(self, toUnpack):
if isinstance(toUnpack, BinaryUnpacker):
buData = toUnpack
else: # assume string
buData = BinaryUnpacker(toUnpack)
self.var1 = buData.get(VAR_INT)
self.var2 = buData.get(BINARY_CHUNK, 64)
self.var3 = buData.get(UINT64)
self.var4obj = AnotherClass().unserialize(buData)
非常感谢你的帮助。
最佳答案
当您对字符串进行切片以获取子字符串时,将创建副本。例如:
[value, nBytes] = unpackVarInt(self.binaryStr[pos:])
这将创建一个从索引
pos
到末尾的字符串副本,这可能会花费较长的时间。如果您可以在获取子字符串之前确定实际所需的字节数,然后使用self.binaryStr[pos:pos+nBytes]
,则速度会更快,因为获取较小的子字符串相对较快。请注意,时间仅取决于子字符串的长度,因此
self.binaryStr[pos:pos+4]
应该花费大致相同的时间量,而不管self.binaryStr
的长度如何。