Найти - Пользователи
Полная версия: Вопросик про производительность работы.
Начало » Python для экспертов » Вопросик про производительность работы.
1 2
ZZZ
Я на днях получил двойной выигрыш в производительности, когда привёл атрибуты класса (int) в локальное пространство метода. Если интересно – скину код.

P.S. Для замеров производительности лучше использовать модуль timeit.
ZZZ
Как я и говорил – делать мне не хер… Оформил тест на эту тему.
# -*- coding: utf-8 -*-

"""Сравнение скорости доступа к глобальным, локальным переменным
и атрибумам объекта."""

class xrange_class(object):
"""xrange_class([start = 0], end, [step = 1])"""
def __init__(self, start_or_stop, end = None, step = 1):
if end is None:
start, end = 0, start_or_stop
else:
start = start_or_stop
self.start = start
self.end = end
self.step = step

# Вычисляем количество членов последовательности
if start < end and step < 0:
self.len = 0
elif start > end and step > 0:
self.len = 0
elif start == end:
self.len = 0
elif step == 0:
raise ValueError("xrange() step argument must not be zero")
else:
self.len = abs((end - start) / step)

# Максимальный и минимальный (отрицательный) индексы
self.max_index = self.len - 1
self.min_index = self.len * (-1)

def __iter__(self):
"""Плюс этого метода не только в скорости, но и в потокозащите."""
start, step, len = self.start, self.step, self.len
n = 0
while n < len:
yield start + step * n
n += 1
raise StopIteration


# Это я перегрузил для чистоты эксперимента
class xrange_class_locals(xrange_class):
def __iter__(self):
start, step, len = self.start, self.step, self.len
n = 0
while n < len:
yield start + step * n
n += 1
raise StopIteration


start = step = len = 0
class xrange_class_globals(xrange_class):
def __iter__(self):
global start
global step
global len
start, step, len = self.start, self.step, self.len
n = 0
while n < len:
yield start + step * n
n += 1
raise StopIteration


class xrange_class_attrs(xrange_class):
def __iter__(self):
n = 0
while n < self.len:
yield self.start + self.step * n
n += 1
raise StopIteration


if __name__ == '__main__':
import timeit
NUM = 10

timer_xrange_class_locals = timeit.Timer('for x in xrange_class_locals(1000000): pass',
'from __main__ import xrange_class_locals')
print "locals: %5.3f" % timer_xrange_class_locals.timeit(NUM)


timer_xrange_class_globals = timeit.Timer('for x in xrange_class_globals(1000000): pass',
'from __main__ import xrange_class_globals')
print "globals: %5.3f" % timer_xrange_class_globals.timeit(NUM)


timer_xrange_class_attrs = timeit.Timer('for x in xrange_class_attrs(1000000): pass',
'from __main__ import xrange_class_attrs')
print "attrs: %5.3f" % timer_xrange_class_attrs.timeit(NUM)


timer_xrange = timeit.Timer('for x in xrange(1000000): pass')
print "xrange: %5.3f :-)" % timer_xrange.timeit(NUM)
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