小子,我不明白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}$非常感谢你的帮助。在
我不认为仅仅凭速度来判断是不恰当的。你说你可以判断出字符串正在被复制,因为如果你把它分成更小的块,它会运行得更快。但是unpack()函数的运行时间(您没有详细说明)也可能取决于数据大小。在
另外,把一根绳子切成
将创建新的字符串对象,因为字符串是不可变的对象。在
当您将字符串切片以获取子字符串时,会生成副本。例如:
这将创建一个从索引
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这个问题,也许对你有用。在
相关问题 更多 >
编程相关推荐