Python Language
профилирование
Поиск…
%% timeit и% timeit в IPython
Профилирование строки конкатенации:
In [1]: import string
In [2]: %%timeit s=""; long_list=list(string.ascii_letters)*50
....: for substring in long_list:
....: s+=substring
....:
1000 loops, best of 3: 570 us per loop
In [3]: %%timeit long_list=list(string.ascii_letters)*50
....: s="".join(long_list)
....:
100000 loops, best of 3: 16.1 us per loop
Профилирование циклов по итерациям и спискам:
In [4]: %timeit for i in range(100000):pass
100 loops, best of 3: 2.82 ms per loop
In [5]: %timeit for i in list(range(100000)):pass
100 loops, best of 3: 3.95 ms per loop
функция timeit ()
Профилирование повторения элементов в массиве
>>> import timeit
>>> timeit.timeit('list(itertools.repeat("a", 100))', 'import itertools', number = 10000000)
10.997665435877963
>>> timeit.timeit('["a"]*100', number = 10000000)
7.118789926862576
команда timeit
Профилирование конкатенации чисел
python -m timeit "'-'.join(str(n) for n in range(100))"
10000 loops, best of 3: 29.2 usec per loop
python -m timeit "'-'.join(map(str,range(100)))"
100000 loops, best of 3: 19.4 usec per loop
line_profiler в командной строке
Исходный код с директивой @profile перед функцией, которую мы хотим профилировать:
import requests
@profile
def slow_func():
s = requests.session()
html=s.get("https://en.wikipedia.org/").text
sum([pow(ord(x),3.1) for x in list(html)])
for i in range(50):
slow_func()
Использование команды kernprof для расчета профилирования по строкам
$ kernprof -lv so6.py
Wrote profile results to so6.py.lprof
Timer unit: 4.27654e-07 s
Total time: 22.6427 s
File: so6.py
Function: slow_func at line 4
Line # Hits Time Per Hit % Time Line Contents
==============================================================
4 @profile
5 def slow_func():
6 50 20729 414.6 0.0 s = requests.session()
7 50 47618627 952372.5 89.9 html=s.get("https://en.wikipedia.org/").text
8 50 5306958 106139.2 10.0 sum([pow(ord(x),3.1) for x in list(html)])
Запрос страницы почти всегда медленнее, чем любой расчет, основанный на информации на странице.
Использование cProfile (Preferred Profiler)
Python включает профилировщик cProfile. Обычно это предпочтительнее использования timeit.
Он разбивает весь ваш скрипт, и для каждого метода в вашем скрипте он сообщает вам:
-
ncalls
: количество раз, когда был вызван метод -
tottime
: общее время, затрачиваемое на заданную функцию (исключая время, сделанное при вызовахtottime
) -
percall
: Время, затраченное на звонок. Или отношение tottime, деленное на ncalls -
cumtime
: совокупное время, потраченное на эту и все подфункции (от вызова до выхода). Этот показатель является точным даже для рекурсивных функций. -
percall
: является частным временем cumtime, деленным на примитивные вызовы -
filename:lineno(function)
: предоставляет соответствующие данные каждой функции
CProfiler можно легко вызвать в командной строке, используя:
$ python -m cProfile main.py
Чтобы отсортировать возвращенный список профилированных методов к времени, указанному в методе:
$ python -m cProfile -s time main.py