Как я могу профилировать юнит-тесты в Python?

У меня есть набор тестов и код, который он тестирует. Если я поставлю from memory_profiler import profile на верхушках соответствующих файлов украсьте функции, которые я хочу профилировать @profileи запустить стандартным способом с python TestThing.pyЯ получаю отличные построчные результаты.

Но line_profiler не входит в пакет таким образом, и единственный способ, которым я смог профилировать что-либо с ним, это с kernprof -l -v thing.py, Если я использую его в своих модульных тестах, ни один из тестов не запускается (на самом деле неудивительно), и результаты не генерируются. Как я могу синхронизировать свои тесты и код, который они используют, способом, аналогичным memory_profiler?

2 ответа

Решение

Конечно, вы можете импортировать line_profiler:

import line_profiler

profiler = line_profiler.LineProfiler()


@profiler
def foo():
    for i in range(10):
        print(i)


foo()

profiler.dump_stats('foo.lprof')

результат сохраняется в foo.lprof.

или, вы можете обернуть memory_profiler как декоратор, распечатать результат после вызова:

def profile_and_show(func):
    profiler = line_profiler.LineProfiler(func)
    def _(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        finally:
            lstats = profiler.get_stats()
            line_profiler.show_text(lstats.timings, lstats.unit)
    return _

Пожалуйста, проверьте pytest-line-profiler.

Вам нужно только украсить (пометить) один или несколько тестов функциями, которые нужно профилировать, и в конце вы получите построчный отчет.

PS: Я являюсь автором этого плагина и буду очень признателен за ваш отзыв.

Другие вопросы по тегам