Проект 2. Оптимизация вычислений в Python
Цель
Исследовать методы оптимизации вычисления кода, используя потоки, процессы, Cython и отключение GIL, на основе сравнения времени выполнения функции численного интегрирования методом прямоугольников, реализованной на чистом Python.
Задание
- Итерация 1: базовая реализация
- Написать полный docstring для функции integrate() по стандарту PEP 257.
- Добавить аннотации типов аргументов и возвращаемого значения по PEP 484.
- Добавить два примера doctest в docstring (тригонометрическая функция и полином 2-й степени).
- Написать юнит-тесты (unittest/pytest): проверка известного интеграла и устойчивость при изменении n_iter.
-
Выполнить замеры производительности через timeit для разных значений n_iter и зафиксировать результаты.
-
Итерация 2: оптимизация потоками
- Реализовать параллельное вычисление интеграла с использованием ThreadPoolExecutor.
- Аннотировать аргументы и возвращаемое значение функции асинхронного интегрирования.
-
Оценить время выполнения при разном числе потоков (n_jobs: 2, 4, 6, 8).
-
Итерация 3: оптимизация процессами
- Реализовать аналогичную функцию, использующую ProcessPoolExecutor.
-
Сравнить производительность потоков и процессов при одинаковых параметрах (n_jobs: 2, 4, 6, 8).
-
Итерация 4: профилирование и оптимизация Cython
- Выполнить профилирование и оптимизировать функцию integrate с помощью Cython.
- Сделать замеры времени для последовательной версии (без потоков/процессов) и сравнить с итерацией 1.
- Сделать замеры времени версий с потоками и процессами и сравнить с итерациями 2 и 3.
-
Использовать annotate=True, получить HTML-аннотацию и оптимизировать код для уменьшения взаимодействия с C-API.
-
Итерация 5: версия noGIL
- Переписать реализацию интегрирования с использованием noGIL.
- Сделать замеры времени для 2, 4, 6 потоков и сравнить:
- поточная версия без GIL (noGIL) vs сайтонизированная версия,
- процессная версия сайтонизированной реализации.
- Оценить необходимость и смысл примитивов синхронизации (семафор/мьютекс) и объяснить выводы.
- Дополнительно: исследовать Python 3.14 и оценить, меняются ли результаты замеров из итерации 2 (нужно ли отпускать GIL).
Выводы
Исследованы способы ускорения численного интегрирования методом прямоугольников. Реализованы версии функции с использованием потоков, процессов, Cython и отключения GIL. Выполнено профилирование, сравнительный анализ времени выполнения и тестирование корректности вычислений.
- Технологии: Python, threading, multiprocessing, Cython, timeit, unittest / pytest.
- Ссылка: GitHub репозиторий