Вимірювання Продуктивності Функції
Хоча вимірювання продуктивності рядкових фрагментів коду іноді може бути достатнім, цей підхід не є гнучким. Використання timeit з функціями забезпечує більш ефективний спосіб вимірювання продуктивності, а декоратори спрощують процес вимірювання продуктивності декількох функцій у чистий і модульний спосіб.
Використання timeit з функціями
timeit може вимірювати продуктивність функцій безпосередньо, передаючи callable (тобто функцію) замість рядка. Це більш гнучко та зручніше для читання, особливо коли потрібно тестувати складні функції.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Ми передаємо generate_squares як функцію (callable), яку потрібно виміряти за допомогою timeit.timeit(). Як і раніше, параметр number визначає кількість запусків функції (15 разів). Середній час виконання обчислюється шляхом ділення загального часу на кількість запусків.
Цей метод є чистішим та більш ефективним для тестування реальних функцій і уникає додаткових витрат на виконання коду зі строки.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Ой, виникла наступна помилка: NameError: name 'np' is not defined. Помилка виникає тому, що timeit.timeit() виконує код ізольовано, тому не має доступу до numpy, якщо явно не імпортувати його через аргумент setup:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Використання функцій є чистішим, зменшує кількість помилок і не вимагає керування зовнішніми імпортами через строку setup.
Підвищення ефективності вимірювання продуктивності за допомогою декораторів
Застосування однакової логіки вимірювання часу до кількох функцій є поширеною практикою, і декоратор забезпечує чистий та ефективний спосіб реалізації цього без дублювання коду.
Кожного разу, коли викликається функція, вона виконується як зазвичай, але з доданим прозорим бенчмаркінгом. Декоратори мають кілька переваг: вони підвищують повторне використання завдяки застосуванню однакової логіки до різних функцій, покращують зрозумілість шляхом відокремлення логіки вимірювання часу від основної функціональності та дозволяють налаштування, наприклад, зміну кількості ітерацій або додавання додаткових метрик для аналізу продуктивності.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Тепер, щоразу коли ви викликаєте функцію, декоровану за допомогою @timeit_decorator, її продуктивність буде автоматично вимірюватися, а результати відображатимуться.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain how decorators work in Python?
What are some other use cases for decorators besides timing functions?
How can I customize the timeit_decorator for different functions?
Awesome!
Completion rate improved to 7.69
Вимірювання Продуктивності Функції
Свайпніть щоб показати меню
Хоча вимірювання продуктивності рядкових фрагментів коду іноді може бути достатнім, цей підхід не є гнучким. Використання timeit з функціями забезпечує більш ефективний спосіб вимірювання продуктивності, а декоратори спрощують процес вимірювання продуктивності декількох функцій у чистий і модульний спосіб.
Використання timeit з функціями
timeit може вимірювати продуктивність функцій безпосередньо, передаючи callable (тобто функцію) замість рядка. Це більш гнучко та зручніше для читання, особливо коли потрібно тестувати складні функції.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Ми передаємо generate_squares як функцію (callable), яку потрібно виміряти за допомогою timeit.timeit(). Як і раніше, параметр number визначає кількість запусків функції (15 разів). Середній час виконання обчислюється шляхом ділення загального часу на кількість запусків.
Цей метод є чистішим та більш ефективним для тестування реальних функцій і уникає додаткових витрат на виконання коду зі строки.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Ой, виникла наступна помилка: NameError: name 'np' is not defined. Помилка виникає тому, що timeit.timeit() виконує код ізольовано, тому не має доступу до numpy, якщо явно не імпортувати його через аргумент setup:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Використання функцій є чистішим, зменшує кількість помилок і не вимагає керування зовнішніми імпортами через строку setup.
Підвищення ефективності вимірювання продуктивності за допомогою декораторів
Застосування однакової логіки вимірювання часу до кількох функцій є поширеною практикою, і декоратор забезпечує чистий та ефективний спосіб реалізації цього без дублювання коду.
Кожного разу, коли викликається функція, вона виконується як зазвичай, але з доданим прозорим бенчмаркінгом. Декоратори мають кілька переваг: вони підвищують повторне використання завдяки застосуванню однакової логіки до різних функцій, покращують зрозумілість шляхом відокремлення логіки вимірювання часу від основної функціональності та дозволяють налаштування, наприклад, зміну кількості ітерацій або додавання додаткових метрик для аналізу продуктивності.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Тепер, щоразу коли ви викликаєте функцію, декоровану за допомогою @timeit_decorator, її продуктивність буде автоматично вимірюватися, а результати відображатимуться.
Дякуємо за ваш відгук!