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?