Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект
Как найти медленное место: timeit, cProfile, сэмплирующий профайлер Tachyon (profiling.sampling) и подключение к живому процессу. Финал: собираем трекер расходов целиком.
- Находить узкие места профайлером
- Подключаться к работающему процессу
- Собрать законченную утилиту на Python 3.15
강의 시작 부분
cProfile: 7 секунд превратились в 195
- Наш отчёт по 1,5 млн трат на python:3.15-slim
- Без профайлера: 6.95 с
- Tachyon: 7.72 с · cProfile: 195 с
- В статье CodeCut: +4% против ×3.4
Трекер расходов строит отчёт по полутора миллионам трат почти семь секунд. Хочется понять, что тормозит, и вы запускаете классический профайлер. Через три минуты он всё ещё работает. Мы замерили честно: без профайлера — шесть и девяносто пять сотых секунды, под классическим cProfile — сто девяносто пять секунд, почти в тридцать раз дольше. А новый профайлер Tachyon из 3.15 — семь и семь десятых. Разберёмся, почему такая разница и как искать узкие места правильно.
$ python pipeline.py # 6.95 с
$ python -m profiling.sampling run pipeline.py # 7.72 с
$ python -m cProfile pipeline.py # 195 с
Правило номер один: сначала измерь
- Кнут: «преждевременная оптимизация — корень всех зол»
- Интуиция о медленном месте ошибается чаще, чем угадывает
- Порядок: замер → профиль → правка → замер
Дональд Кнут когда-то сказал, что преждевременная оптимизация — корень всех зол. Смысл простой: разработчики почти всегда ошибаются, когда угадывают, где программа медленная. Вы тратите день на ускорение функции, которая занимала два процента времени, и не замечаете ту, что занимала шестьдесят. Поэтому порядок всегда один: замерили общее время, нашли профайлером горячее место, исправили именно его и замерили снова. Без второго замера вы не знаете, помогла ли правка.
timeit: точный замер маленького кусочка
- python -m timeit — много повторов, лучший результат
- Сравнивает варианты одной операции
- Для целой программы — профайлер, не timeit
Начнём с самого маленького инструмента. Модуль timeit запускает кусочек кода тысячи раз и показывает, сколько занимает один запуск. Он идеален, чтобы сравнить два способа сделать одно и то же: например, найти категорию регулярным выражением или обычным поиском в словаре. Разница в нашем замере — почти в четыре раза, а на миллионах трат это уже секунды. Но timeit ничего не скажет о целой программе — для этого нужен профайлер.
$ python -m timeit -s "import re" \
"re.search('такси', 'Такси', re.IGNORECASE)"
500000 loops, best of 5: 593 nsec per loop
$ python -m timeit -s "d = {'такси': 'Транспорт'}" \
"d.get('Такси'.lower())"
2000000 loops, best of 5: 163 nsec per loop
전체 강의는 구독 후 이용 가능
전체 버전에는 10개의 슬라이드가 더 있습니다.
로그인하고 구독하면 영상, 모든 슬라이드, 노트, 테스트, AI 튜터, 면접을 이용할 수 있습니다.
로그인 또는 회원가입 구독하기강의 목차
- cProfile: 7 секунд превратились в 195
- Правило номер один: сначала измерь
- timeit: точный замер маленького кусочка
- Трассирующий и сэмплирующий: два способа подсматривать
- Что нового: Tachyon — profiling.sampling (3.15, PEP 799)
- Читаем профиль: кто горячий
- Исправляем горячее место и замеряем снова
- attach: профиль уже работающего процесса
- Режимы и форматы: flame graph, live, gil
- ❓ Стоп-проверка: какой режим включить?
- 💡 Разбор: процессор отдыхает — ищем ожидание
- Итоговый проект: трекер расходов целиком
- Что делать дальше
이 강의 관련 글
- 파이썬 설치 방법: Windows, macOS, Linux에서 단계별로 설치하기
- 파이썬 문자열: split, replace, strip, join, 슬라이싱과 f-문자열
- 파이썬 모듈과 패키지: import, pip, venv, 라이브러리를 쉽게 설명합니다
- 파이썬 독학 방법: 초보자를 위한 단계별 학습 계획
- 파이썬 딕셔너리(dict): 만들기, 메서드, 순회, 정렬, frozendict
이 강좌의 모든 강의
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект