Профилирование кода — это набор статистических данных, который описывает, как часто и как долго выполняются различные части программы. Профилирование может найти долго выполняющиеся части вашего кода. Найдя их, вы можете оптимизировать эти части.
Стандартная библиотека Python предоставляет две разные реализации одного и того же интерфейса профилирования:
- cProfile рекомендуется для большинства пользователей; это расширение Си с разумными издержками, которое делает его пригодным для профилирования долго работающих программ.
- profile , чистый модуль Python, интерфейс которого имитируется cProfile, но который добавляет значительные накладные расходы к профилированным программам. Если вы пытаетесь каким-то образом расширить профилировщик, задача может быть проще с этим модулем.
Модули профилировщика предназначены для обеспечения профиля выполнения для данной программы, а не для целей тестирования. Это особенно относится к сравнительному анализу кода Python с кодом Cи: профилировщики вводят накладные расходы для кода Python, но не для функций уровня Cи, и поэтому код Cи будет казаться быстрее, чем любой код Python.
Простой способ замерить скорость работы кода в python
# Профилирование кода
(Используйте profile вместо cProfile , если последний не доступен в вашей системе.)
Для профилирование кода с cProfile достаточно импортировать модуль и вызвать его функцию run . Давайте посмотрим на простой пример:
import cProfile def print_hi(): print(‘Hi, cPrifile!’) cProfile.run(‘print_hi()’)
1
2
3
4
5
6
cProfile.run(‘print_hi()’) — запустит print_hi() и напечатает результаты профиля, как показано ниже:
Hi, cPrifile! 5 function calls in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 :1() 1 0.000 0.000 0.000 0.000 python_cprofile.py:4(print_hi) 1 0.000 0.000 0.000 0.000 1 0.000 0.000 0.000 0.000 1 0.000 0.000 0.000 0.000
1
2
3
4
5
6
7
8
9
10
11
Первая строка выводит результат выполнения профилированного кода: Hi, cPrifile! Вторая строка указывает, что было отслежено 5 вызовов. Следующая строка говорит нам, в каком порядке результаты выдачи. Заголовки столбцов включают в себя:
- ncalls — на количество вызовов.
- tottime — общее время, потраченное на данную функцию (и исключая время, затраченное на вызовы подфункций).
- percall — ссылается на коэффициент tottime , деленный на ncalls ;
- cumtime — совокупное время, проведенное в этой и всех подфункциях (от вызова до выхода). Эта цифра точна даже для рекурсивных функций.
- Второй столбец percall — это отношение cumtime , деленное на примитивные вызовы (вызов, который не был совершен при помощи рекурсии).
Создадим код с искусственными задержками, и посмотрим, обнаружит ли их cPrifile :
import cProfile import time def run_fast(): print(«The fast function has finished.») def run_medium(): time.sleep(0.5) print(«The medium function has finished.») def run_slow(): time.sleep(2) print(«The slow function has finished.») def main(): run_fast() run_slow() run_medium() cProfile.run(‘main()’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Результатом работы cProfile в этой программе:
The fast function has finished. The slow function has finished. The medium function has finished. 12 function calls in 2.503 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 2.503 2.503 :1() 1 0.000 0.000 0.000 0.000 python_cprofile.py:13(run_fast) 1 0.001 0.001 0.501 0.501 python_cprofile.py:16(run_medium) 1 0.000 0.000 2.001 2.001 python_cprofile.py:20(run_slow) 1 0.000 0.000 2.503 2.503 python_cprofile.py:24(main) 1 0.000 0.000 2.503 2.503 3 0.000 0.000 0.000 0.000 2 2.502 1.251 2.502 1.251 1 0.000 0.000 0.000 0.000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Видим, что у программы ушло 2.5 секунды на запуск. Если вы изучите результаты, то увидите, что cProfile выявил медленную функцию, которая тратит 2 секунды на запуск. Это и есть самая «слабая» часть основной функции. Обычно, когда вы обнаруживаете такие места, вы можете попытаться найти самый быстрый способ выполнения вашего кода, или прийти к выводу, что такая задержка приемлема. В этом примере, мы знаем, что лучший способ ускорить функцию, то убрать вызов time.sleep() , или, по крайней мере, снизить продолжительность сна.
# Выясняем скорость загрузки сайтов
Давайте немного развлечемся и узнаем какой сайт быстрее всех откроется из нашей программы:
import requests import cProfile def get_google(): requests.get(‘https://google.com’) def get_yandex(): requests.get(‘https://yandex.ru’) def main(): get_google() get_yandex() cProfile.run(‘main()’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
17383 function calls (17281 primitive calls) in 0.787 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) . 1 0.000 0.000 0.352 0.352 python_cprofile.py:37(get_google) 1 0.000 0.000 0.435 0.435 python_cprofile.py:40(get_yandex) .
1
2
3
4
5
6
7
8
9
Получили большой список результатов. Поиск по нему можно осуществить используя сочетание клавиш Ctrl+F . давайте найдем только наши функции. Запуск всех сайтов выполнился в 0.787 секунды. Быстрее открылся Google. Это не идеальный тест скорости, но наша задача была выполнена. Мы выясняли скорость открытия сайтов используя cProfile .
Вместо вывода в конце прогона профиля вы можете сохранить результаты в файл, указав имя файла для функции run():
import cProfile импорт re cProfile.run (‘re.compile («foo | bar»)’, ‘restats’)
Класс pstats.Stats считывает результаты профиля из файла и форматирует их различными способами.
Файлы cProfile и профиль также могут быть вызваны как сценарий для профилирования другого сценария. Например:
python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py)
-o записывает результаты профиля в файл, а не в стандартный вывод
-s указывает одно из значений сортировки sort_stats() для сортировки выходных данных. Это применимо только тогда, когда -o не указан.
-m указывает, что модуль профилируется вместо сценария.
Источник: learn4kid-python.firebaseapp.com
#python Как узнать сколько времени займет запуск вашей программы (питон)⏳.

#python Как узнать сколько времени займет запуск вашей программы (питон)⏳.
Опубликовать в социальную сеть
Поделиться видео
Russian
- Albanian
- Amharic
- Arabic
- Brazilian
- Bulgarian
- Croatian
- Danish
- Deutsch
- English
- Farsi
- Français
- Georgian
- Greek
- Hebrew
- Italian
- Lithuanian
- Nederlands
- Polish
- Portuguese
- Română
- Serbian
- Slovak
- Spanish
- Swedish
- Türkçe
- Thai
Источник: best-coding.ru
Программы с числами в Python
В статье «Числа в Python» вы могли изучить теорию работы с числами в языке программирования Python. В этой статье вы сможете научиться создавать небольшие мини-программы применяя числа Python. Для того, чтобы вы могли проработать все примеры на своем компьютере не забудьте установить Python.
Вычисление времени в пути
Программа вычисляет время автомобиля в пути. Пользователь должен ввести расстояние, которое нужно проехать, а также средняя скорость автомобиля. В данном примере мы работаем с целыми числами. Чтобы понять, как работает программа, читайте комментарии. Листинг программы:
print(«*» * 15, «Рассчет времени в пути «, «*» * 10) dist = 0 # Расстояние, которое нужно проехать speed = 0 # Средняя скорость авто, км/ч # Просим пользователя ввести данные dist = int(input(«Расстояние, которое нужно проехать: «)) speed = int(input(«Соединяя скорость: «)) time = dist * 60 / speed # Вычисляем время движения автомобиля print(«Будет затрачено «, time, » минут») # Выводим итог input(«Нажмите Enter для выхода») # Просим нажать кнопку для завершения программы

Результат работы программы:
Вычисления расхода топлива
В данном примере будем работать с дробными числами. Программа вычисляет расход топлива. Пользователь должен ввести средний расход и расстояние. Принцип программы такой же, как в предыдущем примере, но здесь мы хотим получить дробное значение. Чтобы понять, как работает программа, читайте комментарии. Листинг программы:
print(«*» * 15, «Расчет топлива «, «*» * 10) consum = 0 # Средний расход 10.5 л/100 км dist = 0 # Расстояние, км # Просим пользователя ввести данные consum = float(input(«Введите средний расход л./100 км: «)) dist = float(input(«Введите расстояние, км: «)) result = consum * dist / 100 # Вычисляем расход топлива print(«Будет затрачено «, result, » литров») # Выводим итог input(«Нажмите Enter для выхода») # Просим нажать кнопку для завершения программы
Результат работы программы:
Обратите внимание, что в качестве разделителя целой и дробной части используется точка, а не запятая. Если вы введёте 5.5, программа будет работать, а если вы введёте 5,5, то получите сообщение:
Консольный калькулятор
Разработаем самый простой калькулятор. Листинг программы:
print(«*» * 15, «Калькулятор «, «*» * 10) print(«Для выхода введите q в качестве знака операции») while True: s = input(«Знак (+,-,*,/): «) if s == ‘q’: break if s in (‘+’, ‘-‘, ‘*’, ‘/’): x = float(input(«x=»)) y = float(input(«y=»)) if s == ‘+’: print(«%.2f» % (x+y)) elif s == ‘-‘: print(«%.2f» % (x-y)) elif s == ‘*’: print(«%.2f» % (x*y)) elif s == ‘/’: if y != 0: print(«%.2f» % (x/y)) else: print(«Деление на ноль!») else: print(«Неверный знак операции!»)
- Запустим бесконечный цикл. Выход из него осуществлять с помощью оператора break, если пользователь вводит определенный символ вместо знака арифметической операции.
- Если пользователь ввел знак, который не является ни знаком арифметической операции, ни символом-«прерывателем» работы программы, то вывести сообщение о некорректном вводе.
- Если был введен один из четырех знаков операции, то запросить ввод двух чисел.
- В зависимости от знака операции выполнить соответствующее арифметическое действие.
- Если было выбрано деление, то необходимо проверить, не является ли нулем второе число. если это так, сообщить о невозможности деления.
Результат работы программы:
Источник: it-black.ru