Форум сайта python.su
Не нашел в документации как делать сылки на объекты, чтобы сами объекты при этом не копировались в новую переменную.
Имеется такая конструкция
spisok = ''
затем в коде много раз
spisok += ‘какойтохвост’ #Здесь будет тормозить поиск и переаллоцирование памяти для новой строки
re.search('чтототам',self.spisok)
и т.д. и т.п.
Очевидно, что Питон каждый раз выполняет поиск в ассоциативном массиве.
Это медленно, особенно когда массив очень большой.
Как создать ссылку на текущий элемент?
И как наращивать строки без переприсваивания переменных. Ведь строки не мутабельны.
Может быть их можно преобразовать в мутабельную форму?
Что-то типа такого, код гипотетисский
buff = buffer(spisok) #Сссылка на строку или последовательность байтов
buff.append('какойтохвост') #Добавление последовательности байт в конец строки без переприсваивания переменной
…
print self.spisok # здесь результат всех операций со ссылкой
Отредактировано (Июнь 18, 2008 12:54:58)
Офлайн
PyCraft
Как создать ссылку на текущий элемент?
elem = my_dict[ "key" ]
Отредактировано (Июнь 18, 2008 13:13:36)
Офлайн
Хм.. запись видаelem = my_dict не является ссылкой. В данном случае объект будет копироваться по значению, за исключением случая, когда уже сам объект - mutable.
>>> d = {'key': 1}
>>> elem = d
>>> elem += 1
>>> elem
2
>>> d
1
Офлайн
Это-то да, просто я имел ввиду применительно к StringIO уже.
Офлайн
Правда не очень уверен, что он у себя внутри оптимально с памятью работает. Но в принципе можно ему фейковый буфер изначально большой подсунуть.
Офлайн
Так, получается, что ссылку на немутабельный элемент нельзя реализовать, всегда будет копирование по значению?
DaevaornВот методы класса StringIO
Правда не очень уверен, что он у себя внутри оптимально с памятью работает. Но в принципе можно ему фейковый буфер изначально большой подсунуть.
def __init__(self, buf = ''):
# Force self.buf to be a string or unicode
if not isinstance(buf, basestring):
buf = str(buf)
self.buf = buf
self.len = len(buf)
self.buflist = []
self.pos = 0
self.closed = False
self.softspace = 0
def write(self, s):
"""Write a string to the file.
There is no return value.
"""
_complain_ifclosed(self.closed)
if not s: return
# Force s to be a string or unicode
if not isinstance(s, basestring):
s = str(s)
spos = self.pos
slen = self.len
if spos == slen:
self.buflist.append(s)
self.len = self.pos = spos + len(s)
return
if spos > slen:
self.buflist.append('\0'*(spos - slen))
slen = spos
newpos = spos + len(s)
if spos < slen:
if self.buflist:
self.buf += ''.join(self.buflist)
self.buflist = [self.buf[:spos], s, self.buf[newpos:]]
self.buf = ''
if newpos > slen:
slen = newpos
else:
self.buflist.append(s)
slen = newpos
self.len = slen
self.pos = newpos
Отредактировано (Июнь 18, 2008 17:09:32)
Офлайн
Тогда еще вопросец
Что будет быстрее вычисляться(и насколько быстрее) и/или требовать меньше памяти (и насколько меньше),
нулевой элемент кортежа или атрибут экземпляра класса?
d = {}
d[`key1`]=['чтототам1'] #исправлено - список вместо кортежа, т.к. кортежи не переприсваиваются
d[`key2`]=['чтототам2']
d[`key3`]=['чтототам3']
o = d[`key3`]
и дальше все операции с
o[0]
или через свойства класса
class ChtotoTam:
__init__(self,attribute='')
self.attribute=attribute
d = {}
d[`key1`]=ChtotoTam('чтототам1')
d[`key2`]=ChtotoTam('чтототам2')
d[`key3`]=ChtotoTam('чтототам3')
o = d[`key3`]
и дальше все операции с
o.attribute
Отредактировано (Июнь 18, 2008 18:18:54)
Офлайн
Ну в качестве ещё одной цели для профайлинга и выявления самого лучшего варианта, я бы сделал так:
from cStringIO import StringIO buf_size = 1024 buf = StringIO( "\0" * buf_size ) buf.seek(0)
Офлайн
DaevaornЕсли список субстрок не пуст, это это вызовет переаллоцирование памяти (см. += и join)
Ну в качестве ещё одной цели для профайлинга и выявления самого лучшего варианта, я бы сделал так:from cStringIO import StringIO buf_size = 1024 buf = StringIO( "\0" * buf_size ) buf.seek(0)
def seek(self, pos, mode = 0):
"""Set the file's current position.
The mode argument is optional and defaults to 0 (absolute file
positioning); other values are 1 (seek relative to the current
position) and 2 (seek relative to the file's end).
There is no return value.
"""
_complain_ifclosed(self.closed)
if self.buflist:
self.buf += ''.join(self.buflist)
self.buflist = []
if mode == 1:
pos += self.pos
elif mode == 2:
pos += self.len
self.pos = max(0, pos)
Офлайн
PyCraftТак он пуст как раз.
Если список субстрок не пуст, это это вызовет переаллоцирование памяти (см. += и join)
Офлайн