Как я могу профилировать юнит-тесты в 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: Я являюсь автором этого плагина и буду очень признателен за ваш отзыв.