🐍 Python 3.14 стал быстрее запускать программы — без изменения вашего кода
Обычно, когда выходит новая версия Python, разработчики ждут новый синтаксис или новые функции.
Но одно из самых полезных нововведений Python 3.14 вообще не связано с написанием кода.
Новый JIT-компилятор
В Python 3.14 появилась экспериментальная поддержка JIT-компиляции (Just-In-Time).
Если раньше интерпретатор выполнял каждую инструкцию последовательно, то теперь наиболее часто выполняемые участки программы могут компилироваться в машинный код прямо во время работы.
Что это даёт?
Без каких-либо изменений в программе можно получить:
✅ более быстрое выполнение вычислений;
✅ ускорение длительных циклов;
✅ лучшую производительность вычислительных задач.
То есть иногда достаточно просто обновить Python.
Нужно ли переписывать код?
Нет.
Например, такой код:
total = 0
for i in range(10_000_000):
total += i
останется абсолютно тем же.
Но в будущем именно такие участки смогут выполняться быстрее благодаря JIT.
Есть ли ограничения?
Да.
На сегодняшний день JIT:
экспериментальный;
не включён по умолчанию;
приносит пользу не всем типам программ.
Если ваш скрипт работает несколько миллисекунд, разницы вы, скорее всего, не заметите.
А вот для длительных вычислений потенциал очень интересный.
Почему это важно?
Много лет Python критиковали за скорость.
И хотя существуют PyPy, Cython и другие решения, теперь разработчики CPython постепенно внедряют ускорение в сам язык.
Это значит, что в ближайшие годы Python будет становиться быстрее без необходимости менять привычный стиль программирования.
💡 Интересный факт
Ускорение Python — это не одно большое обновление, а серия небольших улучшений.
Начиная с Python 3.11 каждая новая версия постепенно оптимизирует работу интерпретатора. Python 3.14 продолжает эту стратегию, добавляя экспериментальный JIT.
Какой вариант, по вашему мнению, будет правильным?
Большинство без проблем отвечают на первые две строки:
numbers * 3 создаёт новый список: [1, 2, 3, 1, 2, 3, 1, 2, 3]
А numbers + [4, 5] объединяет два списка: [1, 2, 3, 4, 5]
Но третья строка уже гораздо интереснее.
[numbers] * 3
Результат выглядит так:
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3]]
Кажется, что Python создал три независимых списка.
Оператор * не копирует вложенные объекты. Он копирует ссылки на них.
В результате все элементы списка указывают на один и тот же объект в памяти.
Это одна из самых частых ошибок
Подобная конструкция регулярно встречается при создании:
- матриц;
- игровых полей;
- двумерных массивов;
- таблиц динамического программирования.
И может привести к очень неожиданным ошибкам.
Как сделать правильно?
Если нужны независимые вложенные списки, используйте генератор списка:
matrix = [[1, 2, 3] for _ in range(3)]
Теперь каждая строка будет отдельным объектом.
💡 Запомните правило
Если используете оператор * со вложенными изменяемыми объектами — подумайте дважды.
Он копирует не сами объекты, а ссылки на них.