Когда ведущий исследователь вычислительной биологии, Клаус Вилке, заявил в своей статье, что Python — хороший язык для data science, но не великий, — интернет мгновенно воспринял это как начало очередной «языковой войны». Но если убрать эмоции, остаётся важный технический тезис: Python действительно удобен для глубокого обучения, но далеко не идеален для классической исследовательской аналитики.
Как человек, который много лет работает и с Python, и с R, я прекрасно понимаю, о чём он говорит. И всё же этот спор — не про вкусы. Он про архитектуру, когнитивную нагрузку и глубинные различия в философии двух языков.
Попробуем разобраться.
🧪 Python удобен, но заставляет думать не о данных, а о логистике
Главная претензия автора: слишком часто работа в Python превращается в возню с:
- 🧱 типами данных
- 🔢 индексами
- 🔁 циклами и ручным перебором
- 🧩 разборкой и сборкой датафреймов
То есть вместо того, чтобы описывать логику анализа, мы описываем инструкции о том, как пройти по массиву чисел.
Иронично, но Python действительно заставляет «программировать», когда хочется «анализировать».
R и особенно tidyverse создавались с противоположной философией:
«описывай трансформацию данных на человеческом языке, а не на языке итераторов и типов».
🐧 Пингвины из архипелага Палмера: маленький эксперимент, который показывает разницу
Сравним две задачи — вычислить среднее и стандартное отклонение массы пингвинов по видам и островам.
В tidyverse решение выглядит почти как английское предложение:
penguins |>
filter(!is.na(body_mass_g)) |>
group_by(species, island) |>
summarize(
body_weight_mean = mean(body_mass_g),
body_weight_sd = sd(body_mass_g)
)
Аналог на pandas — длиннее и перегружен скобками:
(penguins
.dropna(subset=['body_mass_g'])
.groupby(['species', 'island'])
.agg(
body_weight_mean=('body_mass_g', 'mean'),
body_weight_sd=('body_mass_g', 'std')
)
.reset_index()
)
Разница не драматична. Но стоит попытаться сделать что-то чуть менее стандартное, и Python начинает требовать ручного управления логистикой.
И пример из статьи, где pandas заменили чистым Python, отлично иллюстрирует этот эффект: код превращается в десятки строк с циклами, словарями и сортировками.
🔍 Почему так происходит? Причина глубже, чем кажется
Мне кажется, что дело не только в библиотеках. Здесь важно следующее:
🔧 Python — язык общего назначения
Он создавался как универсальный инструмент, а его датафреймы — надстройка.
🎯 R — язык, созданный вокруг статистики и анализа данных
Его синтаксис исторически ориентирован на векторные операции, формулы, моделирование и визуализацию.
🧠 Ментальная модель программиста в Python — «как сделать»
🧪 Ментальная модель аналитика в R — «что сделать»
И разрыв между этими подходами очень заметен в исследовательской работе, где важны:
- быстрые визуализации
- гибкая агрегация данных
- интерактивные эксперименты
- минимизация когнитивной нагрузки
📊 Визуализация: svord против ggplot2
Ещё один важный момент: большинство студентов действительно испытывают трудности с:
- 🌈 преобразованием графиков
- 🔥 наложением слоёв
- ♻️ переходами «boxplot → violinplot → heatmap»
И причина проста: matplotlib исторически загружен наследием и требует многословного, императивного описания графика.
ggplot2 — декларативный:
описываешь, что за данные и какие геометрии, а не как рисовать пиксели.
Python имеет plotnine, но он менее популярен — культурное наследие сильнее.
🧠 А что насчёт глубокого обучения? Здесь Python — король
Автор справедливо отмечает:
для DL Python идеален.
Причины просты:
- 🐍 PyTorch и TensorFlow стали стандартом де-факто
- 🧮 мощные CUDA-экосистемы
- 🧱 NumPy как фундамент
- 🌐 огромное сообщество и миллионы примеров
- 🧠 интеграция с Jupyter и фреймворками для экспериментов
Но и тут он поднимает важную мысль:
в DL мы до сих пор вручную управляём тензорами, размерностями, слоями.
Это всё ещё низкоуровневая логистика.
И это значит, что в обучении нейросетей тоже не хватает «идеального уровня абстракции».
👀 Моё мнение: Python стал стандартом случайно — и потому он не оптимален
Да, скорее всего:
- Python победил потому, что был лучше Perl,
- вовремя появились NumPy и SciPy,
- и глубокое обучение стало катализатором его доминирования.
Но доминирование ≠ оптимальность.
Если честно, Python — это «универсальный нож», а R — «хирургический инструмент» для EDA, статистики и визуализации.
И когда ты всю жизнь работаешь скальпелем, а тебе дают мультитул — он кажется неудобным.
В то же время мультитул подходит для большего числа задач.
🧩 Так что же выбрать? Ответ прост — и сложен
- 🧠 Нужны модели, DL, интеграция с продом → Python
- 🎨 Нужна визуализация, статистика, EDA → R
- 🔄 Нужна скорость разработки науки → R+tildyverse
- 👷 Нужно писать серьёзное приложение → Python
И лучшая стратегия:
🧪 учить оба языка, не вступая в «религиозные войны».
Код — это инструмент, а не фетиш.
🔗 Источники
- Оригинальная статья:
https://blog.genesmindsmachines.com/p/python-is-not-a-great-language-for - Данные penguins:
https://allisonhorst.github.io/palmerpenguins/