Форум сайта python.su
Мне нужно сделать класс, где со строками длиной 20-100 кб будет производится много операций по преобразованию их, поиску в них итп. Суть не в этом.
Производительность работы будет выше, если:
1. Эти строки будут объявлены вне класса, а в самом классе я буду обращатся к ним через global.
2. Если я их объявлю как атрибуты класса.
Подскажите.
Офлайн
При работе со строками длиной 20-100 кб думаю скоростью обращения к переменным можно пренебреч, имхо. А вообще можно создать локальную переменную в начале метода и использовать её.
Офлайн
По сравнению с временем затрачиваемым на саму работу со строками, разница будет небольшая.
Но разница будет, global - вариант будет быстрее немного. Но глобальные переменные - зло, от которого стоит избавляться.
Поэтому предлагаю такой вариант: строки объявить как атрибуты класса, но перед работой с ними - вносить их в локальный неймспейс функции:
stroka = self.stroka
это вариант будет еще быстрее =)
Офлайн
Мне самому хотелось бы как атрибуты класса, но меня смущает то, что я не знаю как организована работа с памятью в классах питона, а точнее я знаю, что к примеру вот такой код очень низок по производительности:
string100kb='сто килобайт текста'
def myfunc(text):
text.decode('utf-8')
return text
string100kb=myfunc(string100kb)
Офлайн
он передаст по имени, что является аналогом указателя.
Офлайн
не понял, почему ты считаешь, что приведенный код будет медленным? =)
вот:
string100kb='mama mila ramu'
def myfunc(text):
print id(text)
text.decode('utf-8')
return text
print id(string100kb)
string100kb=myfunc(string100kb)
print id(string100kb)
>>>10891376
>>>10891376
>>>10891376
string100kb.decode('utf-8')
Отредактировано (Ноя. 11, 2008 13:13:52)
Офлайн
lorien
Не совсем так.
Строка - неизменяемый объект ( вот личии от MutableString например или листа),
поэтому при операции a += u'попятчсо' ты создаешь новый строку путем сложения старой и u'попятчсо'.
При этому старая останеится в памяти (только имени у нее не будет), пока ее сборщик мусора не соберет.
Отредактировано (Ноя. 11, 2008 13:14:52)
Офлайн
я нуб ))) нафик я тему создавал…
все решилось банальным тестом:
# -*- coding: utf8 -*-
import time
a="абвгдежзиклмнопр"
b=""
for i in range(1,10000): b+=a
timestart=time.time()
class myclass():
def func1(self):
timestart=time.time()
global b
for i in range(1, 5000): c=b.decode("utf-8")
print time.time()-timestart
def func2(self):
timestart=time.time()
for i in range(1, 5000): c=self.aa.decode("utf-8")
print time.time()-timestart
def func3(self):
global b
self.aa=b
s=myclass()
s.func1()
s.func3()
s.func2()
Офлайн
ReinRausа теперь добавь в самом низу еще один вызов s.func1() и ты увидишь, что глобальные всетки быстрее децел =)
в общем как атрибуты класса даже быстрее, чем глобальные.
Отредактировано (Ноя. 11, 2008 13:39:13)
Офлайн
shiza
+1
Офлайн