gpt4 book ai didi

python - 在 Python 中强制传递引用

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:20 25 4
gpt4 key购买 nike

我是不是不明白 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.

关于python - 在 Python 中强制传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com