@DipperTeam
Python Developer

Как мониторить медленные и прожорливые места скрипта?

Пишу свою Python библиотеку с использованием Socket когда залил на хостинг поначалу использовало ОЗУ к 110 мб(Это минимум) но когда я уже сделал основные функции, залил а ОЗУ ест уже к 190 мб, как мне отмониторить каждое место и вывести время исполнения скрипта?
  • Вопрос задан
  • 726 просмотров
Решения вопроса 1
nextel
@nextel
ненавижу javascript
Класс datetime.timedelta - разница между двумя моментами времени, с точностью до микросекунд.
то есть, в начале функции получаем время, и в конце, заткм выхываем timedelta(start_time, end_time) и хоп, вам показывают на какой промежуток выполняется онктретная функцияф или кусок функции

или просто получаем время вначале потом в конце и потом вычитваемиз конечного начальное время это самый легкий способ
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
потребление памяти: https://pypi.python.org/pypi/memory_profiler

Для замера времени выполнения в боевых условиях использую обычно такой менеджер контекста:
class Profiler(object):
    def __init__(self, message_format='Elapsed time: {:.3f} sec'):
        self._message_format = message_format

    def __enter__(self,):
        self._startTime = time.time()

    def __exit__(self, rtype, value, traceback):
        print(self._message_format.format(time.time() - self._startTime))


использовать крайне просто:
with Profiler():
    <код время выполнения которого необходимо замерить>

1. Код программы почти не нуждается в изменении.
2. минимальные накладные расходы(крайне важно поскольку "нормальные" профилировщики сильно всё затормаживают, но и выдают гораздо более детальную информацию)
3. замерит время в любом случае, если даже произойдёт исключение.
4. аналогичную конструкцию(с минимальными изменениями для работы с logging) использую и в продакшене.
Ответ написан
Комментировать
un1t
@un1t
1) в библиотеке Pympler есть функця asizeof

2) можно юзать такой декоратор
import time

def timeit(f):

    def timed(*args, **kw):
        ts = time.time()
        result = f(*args, **kw)
        te = time.time()

        print('func:%r args:[%r, %r] took: %2.4f sec' % (f.__name__, args, kw, te-ts))
        return result

    return timed


3. В третьих https://github.com/rkern/line_profiler
Ответ написан
Shmele
@Shmele
Python developer
По мониторингу быстродействия есть хороший доклад с обзором инструментов и примерами:
https://moscowdjango.ru/meetup/13/profiling-django/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы