Найти - Пользователи
Полная версия: Вопросик про производительность работы.
Начало » Python для экспертов » Вопросик про производительность работы.
1 2
ReinRaus
Мне нужно сделать класс, где со строками длиной 20-100 кб будет производится много операций по преобразованию их, поиску в них итп. Суть не в этом.
Производительность работы будет выше, если:
1. Эти строки будут объявлены вне класса, а в самом классе я буду обращатся к ним через global.
2. Если я их объявлю как атрибуты класса.
Подскажите.
Viper
При работе со строками длиной 20-100 кб думаю скоростью обращения к переменным можно пренебреч, имхо. А вообще можно создать локальную переменную в начале метода и использовать её.
shiza
По сравнению с временем затрачиваемым на саму работу со строками, разница будет небольшая.

Но разница будет, global - вариант будет быстрее немного. Но глобальные переменные - зло, от которого стоит избавляться.
Поэтому предлагаю такой вариант: строки объявить как атрибуты класса, но перед работой с ними - вносить их в локальный неймспейс функции:
stroka = self.stroka
это вариант будет еще быстрее =)
ReinRaus
Мне самому хотелось бы как атрибуты класса, но меня смущает то, что я не знаю как организована работа с памятью в классах питона, а точнее я знаю, что к примеру вот такой код очень низок по производительности:
string100kb='сто килобайт текста'

def myfunc(text):
text.decode('utf-8')
return text

string100kb=myfunc(string100kb)
это я для примера привел, но это непроизводительно.

Меня в классах смущает всего одно- это объявление методов класса. def myfunc_in_myclass(self, other_param)
если в питоне экземпляр класса передается в метод класса как объект, то это будет очень и очень медленно. Если же передается указатель на экземпляр класса, то это будет иметь такую же почти скорость, как и использование global.

Хм… В общем вопрос теперь сводится к другому:
1. Питон передает в метод класса весь экземпляр класса, для которого вызван метод.
2. Питон передает указатель на экземпляр класса.

(указатель я имею ввиду по аналогии с делфи и си- не само значение объекта, а адрес памяти где он находится)
shiza
он передаст по имени, что является аналогом указателя.
shiza
не понял, почему ты считаешь, что приведенный код будет медленным? =)
вот:
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')
будут только на вызов фукнции.
shiza
lorien
Не совсем так.
Строка - неизменяемый объект ( вот личии от MutableString например или листа),
поэтому при операции a += u'попятчсо' ты создаешь новый строку путем сложения старой и u'попятчсо'.
При этому старая останеится в памяти (только имени у нее не будет), пока ее сборщик мусора не соберет.
ReinRaus
я нуб ))) нафик я тему создавал…
все решилось банальным тестом:
# -*- 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()
результаты были такие:
>>> ================================ RESTART ================================
>>>
10.3120000362
10.2809998989
>>>
в общем как атрибуты класса даже быстрее, чем глобальные.
shiza
ReinRaus
в общем как атрибуты класса даже быстрее, чем глобальные.
а теперь добавь в самом низу еще один вызов s.func1() и ты увидишь, что глобальные всетки быстрее децел =)

при первом вызове s.func1() - интрепретатор еще не прогрелся %)

Это я к тому, что меряешь ты неправильно.
Время поиска переменной - настолько мало по сравнению с обработкой строк, что на 5000 итераций, гораздо большее влиение оказывают случайные флуктуации выделения памяти под строки и сборка мусора.
Александр Кошелев
shiza
+1
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB