Рубрики
Без рубрики

Как ориентировать функции в Python

В этой статье мы обсудим 4 подхода к ориентированным функциям в Python первые 3 … Tagged с Python, программированием, 100Дасофкодом, CodeNewie.

В этой статье мы обсудим 4 подхода к ориентированным функциям в Python

Первые 3 метода помогут нам измерить время выполнения функции, пока последний метод поможет нам измерить использование памяти.

Оглавление

  • Используя временную библиотеку
  • Использование Timeit.
  • Использование Line_Profiler.
  • Использование Memory_Profiler
  • Заключение

Используя временную библиотеку

Это один из самых простых способов рассчитать время выполнения функции. Мы по сути получим время в считанные секунды прямо до и после того, как мы вызовим функцию. Разница между ними может дать нам оценку времени функции. Я говорю, по оценкам, поскольку это меры времени на один прогон. Лучший ориентир будет управлять его несколькими временами и рассчитать среднее время.

import time
def func():
   lst = [i for i in range(100000)]
   start = time.perf_counter()
func()
print(f"Completed Execution in {time.perf_counter() - start} seconds")

Ниже приведен выход

Completed Execution in 0.007916 seconds

Использование Timeit.

Время течения это встроенный метод в Python. Это позволяет нам указать количество раз, которые мы хотим запустить функцию, это помогает нам рассчитать среднее время, которое требуется функция. Это лучшая мера, чем время выполнения одного прогона. Однако для сложной функции, которая занимает много времени, этот метод не может быть идеальным.

Общий синтаксис ниже

timeit.Timer(funcName).timeit(number=number)

Номер Сколько раз мы хотим выполнить функцию. Возвращает сумму всех индивидуальных занятий. Чтобы получить среднее, мы можем просто разделить сумму по количеству прогонов.

Ниже приведены то, как мы измеряли среднее время выполнения нашей функции Func ()

import timeit
num_runs = 10
duration = timeit.Timer(func).timeit(number = num_runs)
avg_duration = duration/num_runs
print(f'On average it took {avg_duration} seconds')

Выход ниже

On average it took 0.004649160000000001 seconds

Мы также можем использовать повторить () Метод для запуска эксперимента (запуск функции n раз) несколько раз. В более простых терминах, если мы рассмотрим эксперимент как запуск нашей функции Func () 10 раз, мы можем сделать этот эксперимент 3 раза и получить время выполнения каждого эксперимента.

Общий синтаксис

timeit.Timer(funcName).repeat(repeat=num_repetions,number=num_runs)

Ниже использует его, чтобы позорить нашу функцию Func ()

num_runs = 10
num_repetions = 3
ex_time = timeit.Timer(func).repeat(
repeat=num_repetions,
number=num_runs)
print(f'It took {ex_time}')

Это вернет следующий вывод

It took [0.0494772, 0.04936369999999998, 0.048738000000000004]

Похож на Timeit () Метод, он возвращает общее время для 10 прогонов. Мы можем использовать Макс () Чтобы получить худшее время, мин () Чтобы получить лучшее время и сумма (lst)/len (lst) чтобы получить среднее время выполнения.

Использование Line_Profiler.

Line_Profile – это действительно классная библиотека, которая дает анализ линии функции. Перед использованием библиотеки нам нужно будет установить его

conda install -c anaconda line_profiler

Нам нужно будет добавить декоратор до нашей функции

@profile

def func():
lst = []
for i in range(100000):
lst.append(i)

Поскольку Line-Profiler предоставляет анализ линии, он не имеет большого смысла использовать его со списком пониманием.

Тип Следующие команды в подсказке ANACONDA

kernprof -l main.py
python -m line_profiler main.py.lprof

Первая команда запускает наш сценарий Python и сохраняет журналы в файле. Вторая команда отображает журналы в виде простой для понимания таблицы.

Ниже приведен выход второй команды

Скриншот Line_Profiler

  • Хит- Количество раз этой линии было выполнено.
  • Время- Общее время, сделанное этой линией
  • За хит- Среднее время, сделанное по линии
  • % Время- Фракция общего времени выполнения. Как мы можем видеть с вышеупомянутой картинки, функция Append занимает около 57% от времени выполнения.

Если вы хотите изменить количество раз, функция выполняется для Line_Profiler, используйте следующий код

prof = profile(func)
for i in range(10):
prof()

Это запускает функцию 10 раз.

Использование Memory_Profiler

Это довольно похоже на Line_Profiler, разница, являющаяся генерирующими журналами, рассказывает нам о использовании памяти, а не занятыми.

Во-первых, нам нужно будет установить библиотеку

conda install -c anaconda memory_profiler

Нам придется добавить тот же декоратор, что и прежде

@profile

def func():
lst = []
for i in range(100000):
lst.append(i)

Затем введите следующую команду в подсказке ANACONDA

python -m memory_profiler main.py

Ниже приведен выход

Скриншот Memory_Profiler.

  • Использование Mem – Общее использование памяти на линии
  • Увеличение – использование памяти каждым исполнением этой линии
  • Вхождения – количество раз строка был казнен

Заключение

Если вы хотите, чтобы вы быстрым испытания на производительность работы куска кода или функции, вы должны попробовать измерять время выполнения, используя время библиотека. Однако, если вы хотите лучше оценить, рассмотрите возможность использования Время течения библиотека.

Если вы хотите более подробный анализ строки, рассмотрите возможность использования строки-профилировщика и памяти-профилировщика.

Связь со мной на Linkedin.

Я недавно начал модифицированную версию # 100daysofcode Challenge. Я стремлюсь написать контент, связанный с Python, наукой данных или программированием каждый день. Следуй за моим прогрессом на Twitter , Средний , Dev.to , Hashnode или Мой блог WordPress

Оригинал: “https://dev.to/rahulbanerjee99/how-to-benchmark-functions-in-python-2ga1”