在Python中强制passbyreference

2024-05-14 13:12:58 发布

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

小子,我不明白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
        ....

其用例大致如下:

^{pr2}$

非常感谢你的帮助。在


Tags: 对象posselfreturnvaluedef速度小子
3条回答

我不认为仅仅凭速度来判断是不恰当的。你说你可以判断出字符串正在被复制,因为如果你把它分成更小的块,它会运行得更快。但是unpack()函数的运行时间(您没有详细说明)也可能取决于数据大小。在

另外,把一根绳子切成

unpack('<I', self.binaryStr[pos:pos+4])[0]

将创建新的字符串对象,因为字符串是不可变的对象。在

当您将字符串切片以获取子字符串时,会生成副本。例如:

[value, nBytes] = unpackVarInt(self.binaryStr[pos:])

这将创建一个从索引pos到结尾的字符串副本,对于一个长字符串,这可能需要一些时间。如果可以在使用子字符串之前确定实际需要的字节数,然后使用self.binaryStr[pos:pos+nBytes],这会更快,因为获取一个小的子字符串相对比较快。在

请注意,时间只取决于子串的长度,因此无论self.binaryStr[pos:pos+4]的长度如何,self.binaryStr[pos:pos+4]所花的时间应该大致相同。在

我没有深入研究您的代码,但是公开buffer()方法的类型(如字符串)可以使用memoryview objects访问,而不必复制数据。Here's the relevant documentation为它。在

您可以使用memoryview对象,而不是对字符串进行切片:这样您就可以绕过当前代码的耗时传递。在

几天前,我问了a question这个问题,也许对你有用。在

相关问题 更多 >

    热门问题