Проект 2. Оптимизация вычислений в Python

Цель

Исследовать методы оптимизации вычисления кода, используя потоки, процессы, Cython и отключение GIL, на основе сравнения времени выполнения функции численного интегрирования методом прямоугольников, реализованной на чистом Python.

Задание

  1. Итерация 1: базовая реализация
  2. Написать полный docstring для функции integrate() по стандарту PEP 257.
  3. Добавить аннотации типов аргументов и возвращаемого значения по PEP 484.
  4. Добавить два примера doctest в docstring (тригонометрическая функция и полином 2-й степени).
  5. Написать юнит-тесты (unittest/pytest): проверка известного интеграла и устойчивость при изменении n_iter.
  6. Выполнить замеры производительности через timeit для разных значений n_iter и зафиксировать результаты.

  7. Итерация 2: оптимизация потоками

  8. Реализовать параллельное вычисление интеграла с использованием ThreadPoolExecutor.
  9. Аннотировать аргументы и возвращаемое значение функции асинхронного интегрирования.
  10. Оценить время выполнения при разном числе потоков (n_jobs: 2, 4, 6, 8).

  11. Итерация 3: оптимизация процессами

  12. Реализовать аналогичную функцию, использующую ProcessPoolExecutor.
  13. Сравнить производительность потоков и процессов при одинаковых параметрах (n_jobs: 2, 4, 6, 8).

  14. Итерация 4: профилирование и оптимизация Cython

  15. Выполнить профилирование и оптимизировать функцию integrate с помощью Cython.
  16. Сделать замеры времени для последовательной версии (без потоков/процессов) и сравнить с итерацией 1.
  17. Сделать замеры времени версий с потоками и процессами и сравнить с итерациями 2 и 3.
  18. Использовать annotate=True, получить HTML-аннотацию и оптимизировать код для уменьшения взаимодействия с C-API.

  19. Итерация 5: версия noGIL

  20. Переписать реализацию интегрирования с использованием noGIL.
  21. Сделать замеры времени для 2, 4, 6 потоков и сравнить:
    • поточная версия без GIL (noGIL) vs сайтонизированная версия,
    • процессная версия сайтонизированной реализации.
  22. Оценить необходимость и смысл примитивов синхронизации (семафор/мьютекс) и объяснить выводы.
  23. Дополнительно: исследовать Python 3.14 и оценить, меняются ли результаты замеров из итерации 2 (нужно ли отпускать GIL).

Выводы

Исследованы способы ускорения численного интегрирования методом прямоугольников. Реализованы версии функции с использованием потоков, процессов, Cython и отключения GIL. Выполнено профилирование, сравнительный анализ времени выполнения и тестирование корректности вычислений.

← К проектам