Мальчик, я не понимаю проблем с передачей по ссылке в Python ... Я создал чрезвычайно полезный класс "unpacker", который я передаю различным объектам, которые нужно распаковать из него, но учитывая, насколько он чрезвычайно медленныйЯ могу сказать, что он делает копию binaryStr каждый раз, когда я передаю объект BU.Я знаю это, потому что если я разбиваю BU на более мелкие куски, он работает буквально в 100 раз быстрее (я изначально использовал его для хранения 16 МБ буферного файла ввода-вывода)
Итак, мой вопрос, почему это так?член не передается по ссылке, и есть ли способ заставить его?Я почти уверен, что сам объект 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)
Большое спасибо за вашу помощь.