21 ноября 2025 г.

Питон: он кажется простым?

За последние несколько лет Python вышел на первые строчки популярности. Его ругают за медлительность в некоторых решениях, но он чрезвычайно популярен для бэкенда, Data Science, AI. В чём его сила?

Конечно, правильно — "пайтон": от английского слова Python, которое образовалось не в честь змеи, а благодаря комик-группе «Монти Пайтон» (Monty Python), чьим поклонником был основатель языка Гвидо ван Россум (Guido van Rossum). Однако в профессиональной русскоговорящей среде сложилась традиция произношения «питон», и это следует в русле международного подхода, где символом языка является змея. Это можно усмотреть и в официальном логотипе.

python

В общем, говорить «пайтон» не в тренде. Потому он «питончик»: сильный, гибкий и очень дружелюбный, как к новичкам, так и профессионалам. Читаемый и понятный код, подкреплённый масштабным сообществом и открытыми доступными готовыми решениями, которыми можно расширять собственные приложения.

Python зародился в конце 80-х, когда спрос на компьютеры и ПО стихийно утраивался, а используемые языки программирования были ещё заточены на полугениальных гиков, перемежавших бутерброды с машинным кодом.

Приведём самое простое сравнение, которое можно представить. Язык Си — живая легенда мира разработчиков, на котором написано огромное количество программ, и который является основой и родителем многих языков, включая Python.

Вот так бы мы написали на Си программу, которая подсчитывает среднее значение введённых пользователями чисел:

#include <stdio.h>
#include <stdlib.h>

int main() {
    double sum = 0.0;
    int count = 0;
    double num;

    printf("Введите числа (для окончания ввода нажмите Ctrl+D / Ctrl+Z):\n");

    while (scanf("%lf", &num) == 1) {
        sum += num;
        count++;
    }

    if (count > 0) {
        printf("Среднее значение: %f\n", sum / count);
    } else {
        printf("Числа не были введены.\n");
    }

    return 0;
}

Гораздо проще и понятнее для человека это передаёт Python:

numbers = input("Введите числа через пробел: ").split()
numbers = [float(num) for num in numbers]

average = sum(numbers) / len(numbers)
print("Среднее значение:", average)

Обе программы решают одну задачу. Только в Си это 18 строк, а у питона 4, и разобрать вложенный смысл проще у последнего. Input, значит что-то вводится. Sum — узнаваемое англоязычное «сумма». Нет лишних знаков, вроде фигурных скобок, точек с запятыми. Си ждёт специальной команды для завершения ввода, а Python обрабатывает одну строку. Но даже это показывает разницу в подходах.

К тому же, питон ещё и построен на объектно-ориентированной архитектуре. У него каждая сущность это объект, который имеет свойства и методы, что уменьшает объём кода. Например, буква «A» (для чистоты пусть латинская). Для Си это числовой код из таблицы ASCII (обычно 1 байт), просто символ. Собственно, всё.

Питон смотрит иначе. Для него это строковый объект, который сам про себя знает: что он строка, свою длину, что с другой строкой его можно соединить, а напрямую с числом нет, что буква в верхнем регистре, и многое другое.

>>> foo = 'A'
>>> foo.isupper()
True
>>> foo.isdigit()
False

Разумеется, такое удобство стоит дорого. Видимые операции подкреплены спрятанным кодом, в основном на том же самом Си, который не стал меньше или компактнее. И преобразование из Python в Си расходует ресурсы компьютера: память, время процессора. Собственно, в этом и есть некоторая критикуемая, «слабая» сторона питона. По сравнению с компилируемыми, более низкоуровневыми языками, он отстаёт в производительности.

Однако нюанс, что ощущается это лишь в незначительной части приложений, где требуются серьёзные расчёты или в условиях минимальных ресурсов аппаратной архитектуры (например, микроконтроллеры). Благодаря возросшей за последние десятилетия мощности «железа» недостатки производительности Питона уступили его достоинствам в части элегантности и простоты кода.

Пользователи, которые каждый день открывают миллионы сайтов, созданных с помощью Python, и не замечают, что в чём-то он там отстаёт. Они не заметят также и разницу, если их переписать на другом языке программирования.

Хотя да, например, современный компилируемый Rust быстрее. Значительно быстрее, чем Python. Вот код и время, которое затрачивает «змейка» на вычисление числа Фибоначчи в 10-миллионом ряду (напомню, это из развлечений математиков — формировать в бесконечном наборе последовательность, где очередное число равно сумме двух предыдущих).

>>> import time
>>> def fib(n):
...    a, b = 0, 1
...    for _ in range(n):
...        a, b = b, a + b
...    return a
...
>>>
>>> def calculate():
...     with timer():
...         fib(1_000_000)
...
>>> calculate()
🕒 Elapsed time: 781.716635 сек.

Выглядит довольно долго: 781 секунда (13 минут!). Впрочем, процессору пришлось обработать что-то вроде 40-50 миллионов арифметических и логических операций, только внутри цикла функции, а плюс ещё сопутствующие на уровне процессора. Что на это ответит Rust?

use std::time::Instant;
use num_bigint::BigUint;
use num_traits::{One, Zero};

fn main() {
    let result = time_it!("Elapsed time", { fib(10_000_000) });
}

pub fn fib(n: u128) -> BigUint {
    let mut a = BigUint::ZERO;
    let mut b = BigUint::one();
    for _ in 0..n {
        let tmp = a + &b;
        a = b;
        b = tmp;
    }
    a
}
...
...
> 🕒 Elapsed time: 296.043734s

Что, простите? 300 секунд! То есть разница в 2,6 раза. Если бы это была поездка на Сапсане в Петербург, то вместо 4 часов нам понадобилось бы 10,6 (наверное, как раньше, в купе, с чайком и курочкой).

Отмечу, что вычисления производились на домашнем компьютере с многоядерным процессором Intel(R) Core(TM) i7-12700 (2.10 GHz), 32 Гб ОЗУ. Его теоретический пик ~750 миллиардов операций с плавающей запятой в секунду (GFLOPS). Короче, достаточно мощная машина для таких расчётов.

Конечно, в повседневности никто не считает последовательность Фибоначчи, а разрыв по времени в миллисекундах незаметен или незначителен, на рядовых операциях.

Да, для некоторых задач производительность Python уступает, но, кстати, и этот грех постепенно нивелируется. В том числе за счёт оптимизации интерпретатора Питона, встраивания высокопроизводительных модулей и решений на более эффективных языках на тех участках, где производятся ресурсные операции. Когда же пользователь заказывает носочки в онлайн-маркетплейсе, чаще всего, серверной мощности и возможностей Python будет достаточно, чтобы не создать ему проблем и ощущения длительного ожидания завершения покупки.

trains

Посмотрим, как будет дальше разматываться кривая разработки программного обеспечения, но Python в ней занял достойное место. При своей элегантности и кажущейся простое, на самом деле, он сильнейший профессиональный язык. В том числе именно с его помощью создаются многие приложения для машинного обучения, где мощные и глубокие расчёты одна из базовых потребностей.

Кстати. Этот блог также создан с помощью Python. Спасибо, Гвидо!

← Назад ко всем записям