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, что значительно увеличивает скорость выполнения.
Пример: ускорение функции #
- Создайте файл
example.pyx
:def add(int a, int b): return a + b
- Настройка
setup.py
:from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("example.pyx") )
- Компиляция:
python setup.py build_ext --inplace
- Использование:
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, ...]
Рекомендации #
- Профилирование: используйте
cProfile
для анализа узких мест иsnakeviz
для визуализации. - Cython и NumPy: ускоряйте вычисления при помощи векторизации и компиляции.
- Асинхронность: применяйте
asyncio
для эффективной работы с вводом-выводом иconcurrent.futures
для вычислительных задач.