Иногда мы -Always? Хотите знать, насколько эффективен наш код. Итак, вот волшебные Большой o Обозначение:
Обозначение большой o используется в информатике, чтобы описать производительность или сложность алгоритма. На самом деле большая нотация – это особый символ, который говорит вам, как быстро алгоритм. Конечно, вы часто будете часто использовать предварительно определенные алгоритмы – и когда вы делаете, жизненно важно понять, как быстро или медленно они.
Эффективность охватывает много ресурсов, в том числе:
- CPU (Время) Использование
- Использование памяти
- Использование диска
- Использование сети
Все важно, но мы поговорим о времени ЦП: Сложность времени или использование ЦП. Мы можем оценить его, как показано ниже:
#!/usr/bin/env python # -*- coding: utf-8 -*- import datetime def foo(): print("foo bar") start_time = datetime.datetime.now() foo() finish_time = datetime.datetime.now() duration = finish_time - start_time print(f"Execution time: {duration}")
Есть ли лучший метод для этого? Да, с декоратор
:
Что такое декораторы в Python?
Python имеет интересную функцию, называемую декораторами, чтобы добавить функциональность в существующий код.
Это также называется MetaProgramming
В рамках программы пытается изменить другую часть программы во время компиляции.
Декораторы позволяют нам обернуть другую функцию, чтобы расширить поведение обернутой функции, не модифицируя его.
В декораторах функции принимаются в качестве аргумента в другую функцию, а затем вызывают внутри функции обертки.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import random import functools def time_decorator(func): """ Calculate the execution time of a method and return it back""" @functools.wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) duration = time.time() - start print(f"Duration of {func.__name__} function was {duration}.") return result return wrapper # with a function @time_decorator def sum_random_numbers(ran_num): """ Return the sum between 0 and ran_num""" total_sum = 0 for num in range(0, ran_num): total_sum += num return total_sum # with a class instance method class Klass: @time_decorator def sum_random_numbers(self, ran_num): """ Return the sum between 0 and ran_num""" total_sum = 0 for num in range(0, ran_num): total_sum += num return total_sum if __name__ == "__main__": # generate a random number between 1.000.000 and 2.000.000 ran_num = random.randint(1_000_000, 2_000_000) print(f"random_number: {ran_num}") sum_random_numbers(ran_num=ran_num) Klass().sum_random_numbers(ran_num=ran_num)
Если мы запустим код, вывод будет похоже на:
random_number: 1123388 Duration of sum_random_numbers function was 0.05038046836853027. Duration of sum_random_numbers function was 0.04922914505004883.
Итак, мы можем использовать это декоратор
Чтобы оценить нашу эффективность везде в наших кодах с легкостью.
Приложение:
Для получения дополнительной информации о декораторах в Python: Декораторы для функций и методов
Также я очень рекомендую использовать встроенный Python Регистрация
Метод вместо Печать
Отказ
import logging logger = logging.getLogger(__name__) logger.info(f"Execution time: {self.func.__name__} function was {duration}")
Оригинал: “https://dev.to/serhatteker/big-o-in-python-with-decorator-572c”