Skip to main content
 首页 » 编程设计

python之在 Python 中强制传递引用

2025年05月04日14webabcd

我是不是不明白 python 的引用传递问题...我已经创建了非常有用的“解包器”类,我将它传递给需要从中解包的各种对象,但考虑到它的速度非常慢,我可以看出它在每次传递 BU 对象时都在制作 binaryStr 的副本。我知道这一点是因为如果我将 BU 分成更小的 block ,它的运行速度实际上会快 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.