← Назад к вопросам

Какие знаешь проблемы с производительностью у цикла for?

2.0 Middle🔥 181 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проблемы производительности цикла for в Python

Цикл for в Python — это фундаментальный инструмент, но при неправильном использовании может стать узким местом приложения. Рассмотрим основные проблемы:

1. Глобальная область видимости (Global Lookup)

Каждая итерация цикла ищет переменные в глобальной области видимости, что замедляет выполнение:

# ❌ Медленно
total = 0
for i in range(1000000):
    total += i

# ✅ Быстро — локальная переменная
def fast_sum():
    total = 0
    for i in range(1000000):
        total += i
    return total

Второй вариант быстрее на 10-15%, так как поиск локальной переменной выполняется за O(1), а глобальной — через словарь.

2. Функциональные вызовы внутри цикла

Вызов функции имеет накладные расходы. Если вызывать функцию в каждой итерации — это замедляет выполнение:

# ❌ Медленно
import math
result = []
for i in range(1000000):
    result.append(math.sqrt(i))

# ✅ Быстро
import math
sqrt = math.sqrt  # кэшируем ссылку
result = []
for i in range(1000000):
    result.append(sqrt(i))

# ✅✅ Ещё быстрее — list comprehension
result = [math.sqrt(i) for i in range(1000000)]

3. Динамическая типизация

Python проверяет типы во время выполнения. В цикле это может быть критично:

# ❌ Медленно — разные типы
data = [1, "2", 3.0, "4", 5]
for item in data:
    print(item + 1)  # ошибка для строк

# ✅ Быстро — однородные данные
data = [1, 2, 3, 4, 5]
for item in data:
    print(item + 1)

4. List Comprehension vs цикл for

List comprehension быстрее, чем явный цикл с .append():

# ❌ Медленно — несколько операций
result = []
for i in range(1000000):
    if i % 2 == 0:
        result.append(i * 2)

# ✅ Быстро — оптимизировано интерпретатором
result = [i * 2 for i in range(1000000) if i % 2 == 0]

5. Дополнительные переменные и условия

Нечистые циклы с множеством побочных действий медленнее:

# ❌ Медленно
count = 0
total = 0
for i in range(1000000):
    if i > 100 and i < 900000:
        count += 1
        total += i

# ✅ Быстро — фильтр один раз
filtered = [i for i in range(1000000) if 100 < i < 900000]
count = len(filtered)
total = sum(filtered)

6. Циклы с вложенными структурами данных

Добавление элементов в список во время итерации замедляет процесс:

# ❌ Медленно
data = list(range(100))
for item in data:
    data.append(item * 2)  # список растёт во время итерации

# ✅ Быстро
data = list(range(100))
data.extend([item * 2 for item in data])

7. Использование встроенных функций

Встроенные функции на C работают быстрее:

# ❌ Медленно — явный цикл
result = 0
for i in range(1000000):
    result += i

# ✅ Быстро — встроенная функция
result = sum(range(1000000))

8. NumPy для больших данных

Для численных вычислений используй NumPy вместо цикла:

import numpy as np

# ❌ Медленно — цикл Python
result = []
for i in range(1000000):
    result.append(i ** 2)

# ✅ Быстро — NumPy vectorization
array = np.arange(1000000)
result = array ** 2

Итоги

Основные правила оптимизации циклов:

  • Избегай глобальных переменных, используй локальные
  • Минимизируй вызовы функций
  • Используй list comprehension вместо .append()
  • Кэшируй ссылки на функции при повторном использовании
  • Используй встроенные функции (sum(), map(), filter())
  • Для больших данных используй NumPy
  • Профилируй код перед оптимизацией