Оптимизация кода на Python
Материалы в разработке
Эта страница находится в процессе подготовки и не является финальной версией. Содержание будет дорабатываться и обновляться в течение текущего семестра.
Профилирование
Прежде чем оптимизировать, нужно найти узкие места. Python предоставляет несколько инструментов.
cProfile
cprofile.py
import cProfile
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
cProfile.run('fibonacci(30)')
python -m cProfile -s cumtime my_script.py
line_profiler
Построчное профилирование — показывает время каждой строки:
line_profiler.py
# pip install line_profiler
@profile
def slow_function():
total = 0
for i in range(1000000):
total += i * i
return total
kernprof -l -v my_script.py
Практический совет
Начинайте с cProfile для общей картины, затем используйте line_profiler для детального анализа горячих функций.
timeit — измерение времени
timeit.py
import timeit
# Сравнение подходов
t1 = timeit.timeit('sum(range(1000))', number=10000)
t2 = timeit.timeit(
'total = 0\nfor i in range(1000): total += i',
number=10000
)
print(f"sum(): {t1:.4f}s, for loop: {t2:.4f}s")
memory_profiler
memory.py
# pip install memory_profiler
from memory_profiler import profile
@profile
def create_large_list():
a = [i for i in range(1000000)]
b = [i**2 for i in a]
del a
return b
Частая ошибка
Преждевременная оптимизация — корень всех зол (Д. Кнут). Всегда профилируйте перед оптимизацией. 90% времени обычно тратится в 10% кода.