Производительность и оптимизация

18. Производительность и оптимизация #

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


18.1. Профилирование кода #

Профилирование позволяет определить «узкие места» в производительности программы. В Python для этого можно использовать встроенные инструменты и сторонние библиотеки.

Модуль cProfile #

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

Пример: базовое использование #
import cProfile

def slow_function():
    total = 0
    for i in range(10**6):
        total += i
    return total

cProfile.run("slow_function()")
Вывод #
   4 function calls in 0.283 seconds
   Ordered by: standard name
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.283    0.283    0.283    0.283 script.py:3(slow_function)
        1    0.000    0.000    0.283    0.283 <string>:1(<module>)
        1    0.000    0.000    0.283    0.283 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Модуль timeit #

timeit используется для замеров времени выполнения небольших фрагментов кода.

Пример: замер производительности функции #
import timeit

code = """
total = 0
for i in range(10**6):
    total += i
"""
print(timeit.timeit(code, number=1))  # Время выполнения

Визуализация с помощью snakeviz #

snakeviz визуализирует результаты cProfile.

Установка #
pip install snakeviz
Использование #
python -m cProfile -o profile.out script.py
snakeviz profile.out

18.2. Использование Cython и NumPy для ускорения #

Ускорение с Cython #

Cython компилирует Python-код в C, что значительно увеличивает скорость выполнения.

Пример: ускорение функции #
  1. Создайте файл example.pyx:
    def add(int a, int b):
        return a + b
    
  2. Настройка setup.py:
    from setuptools import setup
    from Cython.Build import cythonize
    
    setup(
        ext_modules=cythonize("example.pyx")
    )
    
  3. Компиляция:
    python setup.py build_ext --inplace
    
  4. Использование:
    from example import add
    print(add(10, 20))  # 30
    

Оптимизация с NumPy #

NumPy обеспечивает высокую производительность благодаря векторизации операций и использованию библиотек на C.

Пример: сравнение с обычным Python #
import numpy as np
import time

# Сложение массивов в Python
start = time.time()
a = [i for i in range(10**6)]
b = [i for i in range(10**6)]
c = [x + y for x, y in zip(a, b)]
print(f"Python: {time.time() - start} сек")

# Сложение массивов в NumPy
start = time.time()
a = np.arange(10**6)
b = np.arange(10**6)
c = a + b
print(f"NumPy: {time.time() - start} сек")

18.3. Асинхронные вычисления #

Асинхронное программирование позволяет выполнять задачи параллельно, не блокируя основной поток.

Модуль asyncio #

asyncio управляет асинхронными задачами и потоками.

Пример: асинхронные задачи #
import asyncio

async def task(name, delay):
    await asyncio.sleep(delay)
    print(f"Задача {name} завершена")

async def main():
    await asyncio.gather(
        task("A", 1),
        task("B", 2),
        task("C", 3)
    )

asyncio.run(main())

Модуль concurrent.futures #

Для многопоточности и многопроцессности можно использовать ThreadPoolExecutor или ProcessPoolExecutor.

Пример: использование ThreadPoolExecutor #
from concurrent.futures import ThreadPoolExecutor
import time

def compute_square(x):
    time.sleep(1)
    return x * x

with ThreadPoolExecutor(max_workers=4) as executor:
    results = executor.map(compute_square, range(10))

print(list(results))  # [0, 1, 4, 9, ...]

Рекомендации #

  1. Профилирование: используйте cProfile для анализа узких мест и snakeviz для визуализации.
  2. Cython и NumPy: ускоряйте вычисления при помощи векторизации и компиляции.
  3. Асинхронность: применяйте asyncio для эффективной работы с вводом-выводом и concurrent.futures для вычислительных задач.