line_profiler

line_profiler - Π»ΠΈΠ±Π° для построчного профилирования.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - подсчСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎ врСмя Π΅Π΅ выполнСния; посторочноС ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - подсчСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ: врСмя выполнСния, потрСбляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Установка

pip install line_profiler

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ посрСдством запуска ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ модуля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kernprof ΠΈΠ»ΠΈ посрСдством создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° LineProfiler ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅ΠΌΡƒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

kernprof

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования kernprof, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСста.

Π”Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ @profile, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ² Π½Π΅ трСбуСтся.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ тСсты, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pytest.main ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ тСсту:

import pytest

pytest.main("{path_to_test}")

ЗапускаСм тСст, пСрСдавая Π½Π° Π²Ρ…ΠΎΠ΄ созданный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

kernprof -v -l {module}.py

Π€Π»Π°Π³ -v ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ профилирования сразу послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ модуля.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     5                                           @profile
     6                                           async def test_sync_actresses_without_videos(loop, sync_db, actress_without_videos, vk_token):
     7         1      51289.0  51289.0     63.7      assert sync_db.actresses.find({'has_videos': False}).count() == len(actress_without_videos)
     8
     9         1         21.0     21.0      0.0      with patch('rptp.getters.get_videos',
    10         1       3071.0   3071.0      3.8                 CoroutineMock(return_value=[{'url': 'https://vk.com/video150323989_162611387'}])):
    11         1      18104.0  18104.0     22.5          await sync_actresses_without_videos(sync_db, vk_token)
    12
    13         1       7988.0   7988.0      9.9      assert sync_db.actresses.find({'has_videos': False}).count() == 0

ПослС запуска модуля Ρ‚Π°ΠΊΠΆΠ΅ появится Ρ„Π°ΠΉΠ» {module}.py.lprof, содСрТащий Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ профилирования, для просмотра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ line_profiler:

python -m line_profiler {module}.py.lprof

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: https://stackoverflow.com/a/23765051/5500609

LineProfiler

Для профилирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ LineProfiler ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ экзСмпляр класса ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ профилирования:

from line_profiler import LineProfiler

def profile(func):
    def wrapper(*args, **kwargs):
        profiler = LineProfiler(func)
        profiler.enable_by_count()
        result = func(*args, **kwargs)
        profiler.dump_stats(f'{func.__name__}.lprof')
        return result

ПослС дСкорирования ΠΈ запуска ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°ΠΌΠΈ. Для просмотра - снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ line_profiler.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: https://zapier.com/engineering/profiling-python-boss/

Last updated

Was this helpful?