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

«Большой O» в Python с декоратором

Иногда мы -Always? Хотите знать, насколько эффективен наш код. Итак, вот поступает волшебная большая нотация … Помечено Python, декоратор, Bigo.

Иногда мы -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”