P(hD)ython
Открыть в Telegram
О Python, PhD, распределённых системах и не только Автор - Михаил Масягин (@masyagin1998): - Python Lead в NDA HFT; - преподаватель в Бауманке; - эксперт по СУБД System Design World; - любитель PhD и авторегрессии.
БольшеСтрана не указанаКатегория не указана
214
Подписчики
Нет данных24 часа
Нет данных7 дней
Нет данных30 день
Архив постов
214
«HFT-доклад прошёл по плану 😎»
День Московского четвертьфинала ICPC позади 😌
Поговорили с многими десятками студентов, раздали тонны мерча и ещё больше ребят завлекли на наш контест 😈
Я очень волновался перед выступлением, но всё прошло просто супер! Были и доп. вопросы, и бурные овации! ❤️
Особенно приятно было видеть студентов из родной Бауманки! Ребята - вы лучшие! 🔥
P.S. Больше фото в комментариях!
P.P.S. А вот и видео https://youtu.be/i8GXmeoMmn8?t=28055 !
С уважением,
Михаил Масягин
214
«Сдеаноню NDA HFT на 300+ человек 😈😬»
Уже в это воскресенье я буду выступать с живой лекцией на 300+ человек на четвертьфинале ICPC в Сколково и публично расскажу о том, как построить современную и прибыльную HFT-инфраструктуру с нуля 😎!
Присоединяйтесь: https://t.me/moscowregional_news/48 🚀!
О чём поговорим:
- как выглядит живой пайплайн HFT изнутри, а не в учебных статьях;
- почему shared memory решает;
- что такое hot- и cold-path;
- что точно должен уметь делать ваш бэктест;
- и ещё о миллионе технических нюансов!
- ах да, и о том, где лучше работать в HFT 🤑
Если вдруг вы будете среди этих 300+ человек (а я точно знаю, что в этом канале сидит несколько олимпиадников ❤️), подходите после доклада - поболтаем про HFT, борьбу за микросекунды и вот это вот всё наше!
P.S. А ещё у нас будет свой собственный олимпиадный контест с уклоном в HFT и стенд с рафом, матчей и чётким мерчом для чётких разработчиков 😎
С уважением,
Михаил Масягин
214
«Python для собесов - 2026 🚀»
Продолжаем подготовку к
Python-собесам!
В прошлом посте мы перенесли тяжёлую функцию из Python в C, используя механизм FFI. Сегодня мы научимся делать это более элегантно 💅 посредством Python-компиляторов, таких как Numba, Pythran или JAX. Они компилируют подмножество Python в машинный код для CPU или GPU, тем самым повышая производительность и оставаясь в рамках Python.
У каждого из приведённых инструментов своё собственное поддерживаемое подмножество Python, но базово можно считать, что все они способны компилировать функции, принимающие на вход, порождающие внутри себя и возвращающие:
- numpy-структуры данных, исключая object;
- Python-примитивы (int, float, complex, bool, str, ...);
- реже - гомогенные числовые списки (List[float], List[int], ...).
Python-компиляторы работают следующим образом:
- Вы пишете Python-функцию и помечаете её компилируемой с помощью декоратора (Numba, JAX) или комментария (Pythran).
- Далее, если компилятор работает как JIT (Just-in-Time), то он... ничего не делает 😄 (Numba, JAX), а вот AOT-компилятор сразу приступает к «конвертации» функции в машинный код (Pythran). Недостатком второго подхода является то, что он требует задавать типы входных данных на этапе написания кода. Кстати, в Numba так тоже можно сделать.
- При исполнении Python-кода в случае AOT'а сразу запускается «бинарная» версия функции, а в случае JIT'а - функция компилируется при первом вызове, а при последующих уже используется её производительная версия. В связи с этим JIT'ованные функции важно «прогревать» - вызывать их с примером входных параметров при инициализации приложения, дабы исключить задержки компиляции при исполнении. Отмечу, что Numba и Pythran налагают ограничения только на типы входных данных, а JAX - ещё и на их размер, то есть для Numba и Pythran вызовы func([1, 2, 3]) и func([4, 5]) идентичны, а для JAX они, грубо говоря, приводят к двум разным функциям.
Пара важных нюансов:
- Переходы между Python и скомпилированным кодом дороги. Чтобы их минимизировать, следует делать компилируемые функции крупнее. Например, если в коде есть обработка данных в цикле, то лучше компилировать цикл целиком.
- Чтобы не бить проект на отдельные компилируемые функции, можно использовать режим jit в Numba: он скомпилирует лишь то, что сможет. К сожалению, его производительность непредсказуема.
К примерам! Напишем функцию fmul из прошлого поста на Numba и Pythran. А на JAX можете написать сами 😄.
Numba:
Поставим Numba:
pip install numba
Затем создадим файл numba_demo.py:
import numpy as np
from numba import njit
@njit
def fmul_numba(a, b, out, n):
for i in range(n):
out[i] = a[i] * b[i]
out = np.empty(4, dtype=np.float64)
fmul_numba(np.array([0.0, 0.5, 1.0, 1.5]), np.array([1.0, 2.0, 3.0, 4.0]), out, 4)
print(out)
Запустим его:
python3 numba_demo.py
[0. 1. 3. 6.]
Pythran:
pip install pythran
fmul_pythran.py:
# pythran export fmul_pythran(float[], float[], float[], int)
def fmul_pythran(a, b, out, n):
for i in range(n):
out[i] = a[i] * b[i]
pythran_demo.py:
import numpy as np
from fmul_pythran import fmul_pythran
import sys
print(sys.modules["fmul_pythran"])
out = np.empty(4, dtype=np.float64)
fmul_pythran(np.array([0.0, 0.5, 1.0, 1.5]), np.array([1.0, 2.0, 3.0, 4.0]), out, 4)
print(out)
pythran fmul_pythran.py
ls
fmul_pythran.cpython-312-x86_64-linux-gnu.so fmul_pythran.py pythran_demo.py
python3 pythran_demo.py
<module 'fmul_pythran' from './fmul_pythran...so'>
[0. 1. 3. 6.]
Кстати, пару лет назад на одном из собесов мне пришлось писать Numba-код, так что это даже более актуально, чем FFI 🤓.
Сегодня мы познакомились с Python-компиляторами, в следующем посте поговорим о том, как понять, какие именно функции нам надо компилировать! ⚙️🚀
С уважением,
Михаил Масягин214
«Python для собесов - 2026 🚀»
На днях я понял, что хоть мой канал и называется P(hD)ython, на нём всё ещё нет ни одного полноценного поста про
Python 😅.
Исправим это! Запускаю серию постов, которые помогут Вам при прохождении Python-собеседований в 2026 году 😎.
Один из моих любимых вопросов на Python-собесах звучит так: «если все ругают Python за скорость, то почему на нём пишут столько ML и математики?!». Удивительно, но часто на нём сыплются даже матёрые разработчики.
Отвечаю! Сам по себе Python и правда медленный (почему - отдельный вопрос), но когда дело доходит до тяжёлых вычислений, оказывается, что он вызывает функции, написанные на компилируемых языках вроде Rust, C\C++ или... Fortran!
Так, например, numpy по сути является обёрткой над С-массивами, а scipy.linalg.lapack обычно импортирует Fortran-библиотеку LAPACK! Даже pytorch, исполняясь на GPU, по факту делает это на C\C++ & CUDA ⚙️.
Всё это достигается за счёт Foreign Function Interface (FFI) - механизма, позволяющего коду на одном языке вызывать функции, написанные на другом. FFI есть не только в Python. Он имеется в Rust (extern "C" & unsafe), Java (JNI & JNA), Go (cgo) и т.д., так что идея этого поста легко обобщается и на другие языки.
А теперь пример! Сегодня мы напишем свой собственный numpy с поэлементным умножением float-векторов!
Сперва реализуем функцию fmul поэлементного умножения float-векторов на C в файле fmul.c:
#include <stddef.h>
void fmul(const float* a, const float* b, float* out, size_t n) {
for (size_t i = 0; i < n; ++i) out[i] = a[i] * b[i];
}
Скомпилируем его как разделяемую библиотеку:
gcc -O3 -fPIC -shared -o libfmul.so fmul.c
Установим cffi для поддержки FFI в Python:
pip install cffi
Теперь напишем Python-класс для работы с float-векторами и fmul в файле fmul.py:
from array import array
from pathlib import Path
from cffi import FFI
# через FFI подгружаем разделяемую библиотеку в Python-код
ffi = FFI()
ffi.cdef("void fmul(const float* a,const float* b,float* out,size_t n);")
C = ffi.dlopen(str(Path(__file__).with_name("libfmul.so")))
class F32Vec:
# используем __slots__ для более компактного и производительного представления объектов класса
__slots__ = ("a",)
# требуем, чтобы наш класс конструировался из float-массива Python
def __init__(self, data):
self.a = (
data
if isinstance(data, array) and data.typecode == "f"
else array("f", data)
)
def __len__(self):
return len(self.a)
def _mul_arr(self, other):
if len(self.a) != len(other):
raise ValueError("len mismatch")
# готовим выходной массив
out = array("f", [0.0]) * len(self.a)
# вызываем через FFI C-функцию fmul
C.fmul(
ffi.from_buffer("float[]", self.a),
ffi.from_buffer("float[]", other),
ffi.from_buffer("float[]", out),
len(self.a),
)
return F32Vec(out)
# перегружаем операторы умножения, чтобы поэлементное произведение работало как в numpy
def __mul__(self, other):
if isinstance(other, F32Vec):
return self._mul_arr(other.a)
if isinstance(other, (int, float)):
return self._mul_arr(array("f", [float(other)]) * len(self.a))
return self._mul_arr(array("f", other))
__rmul__ = __mul__
def tolist(self):
return list(self.a)
def __repr__(self):
return f"F32Vec({list(self.a)})"
if __name__ == "__main__":
x = F32Vec([0.0, 0.5, 1.0, 1.5])
y = F32Vec([1.0, 2.0, 3.0, 4.0])
print(x._mul_arr(y.a))
print((x * y).tolist())
print((x * 2.0))
print((2.0 * x).tolist())
Наконец, запустим код:
python3 fmul.py
F32Vec([0.0, 1.0, 3.0, 6.0])
[0.0, 1.0, 3.0, 6.0]
F32Vec([0.0, 1.0, 2.0, 3.0])
[0.0, 1.0, 2.0, 3.0]
Сегодня мы узнали, почему медленный Python способен быстро перемножать вектора, и как работает FFI! К сожалению, FFI громоздок и требует знания других языков. Как этого избежать - поговорим в следующем посте 🚀!
С уважением,
Михаил Масягин214
«Коробки & EXPAR»
К сожалению, октябрь выдался совсем без постов - переезд, коробки и постоянные переносы доставок добили меня 😅. Но вот я снова в строю 🫡!
Небольшой научный апдейт: наконец вышла моя статья в «Вестнике МГТУ им. Н. Э. Баумана: сер. естественные науки» совместно с моим научным руководителем - В. Б. Горяиновым:
Вычисление асимптотической ковариационной матрицы оценки Хьюбера в обобщенной экспоненциальной авторегрессионной модели.
Журнал входит в белый список ВАК, Scopus и т.д., так что всё по понятиям 😎
А теперь замолвлю пару слов об экспоненциальной авторегрессионной модели aka EXPAR.
Несмотря на продолжительную историю, она очень активно применяется в различных инженерных и научных областях, включая трейдинг.
Мы получили её асимптотическую ковариационную матрицу для оценки Хьюбера, а затем и для произвольной M-оценки, что позволяет при известном обновляющем процессе по малому набору данных оценивать дисперсию на «большом» наборе для заданной функции потерь и тем самым значительно упрощать её выбор в прикладных задачах.
Ещё один шажок к диссертации 💪.
Для цитирования (а что, а вдруг):
Горяинов В. Б., Масягин М. М. Вычисление асимптотической ковариационной матрицы оценки Хьюбера в обобщённой экспоненциальной авторегрессионной модели. Вестник МГТУ им. Н. Э. Баумана. Сер. Естественные науки, 2025, № 4 (121), с. 23–39. EDN: QCRHHH.
P.S. На фото есть маленькая отсылка к одному из «египетских» постов - кто найдёт, тот молодец 👀
С уважением,
Михаил Масягин
214
«Штормит рынок 🌊 - держи курс! 🧭»
А вот и первый апдейт после отпуска!
Общаюсь с коллегами-разработчиками из разных компаний - и картина у всех схожая: вакансий всё меньше, собеседования всё жёстче, рынок штормит.
Если раньше для Python Senior'а хватало умения написать декоратор с произвольным числом параметров и отличать new от init, то теперь даже на Middle-позицию могут попросить спроектировать Uber, URL-Shortener или даже собственный S3!
Но мы с @vova_dev стараемся быть маяком 🗼 в это непростое время 🚀!
Стартовал второй поток нашего курса по System Design - https://nevzorov.courses!
Я веду часть курса по СУБД и мучаю студентов на мок-интервью 😈
На моих лекциях поговорим о:
- индексах и транзакциях;
- шардировании и репликации;
- кэшах и бэкапах;
- CAP, PACELC и почему их никто не понимает (кроме Мартина Клеппманна и конечно же нас с Вовой 😅);
- и даже... сделаем RAG и устроим эпичную битву Postgres + PGBouncer vs MS SQL SQLOS!
Никакой «воды» - только практика, реальные кейсы и нюансы, которые помогут уверенно пройти System Design Interview и выйти на желаемый оффер.
P.S. Курс уже начался, так что это не реклама, а просто рассказ про то, какие мы молодцы 😄
P.P.S. Залететь на курс ещё не поздно 😂
С уважением,
Михаил Масягин
214
«Верность заветам Ильича 🫡»
Одно из моих увлечений - история России конца XIX - начала XX веков. Когда погружаешься в её пучину, узнаёшь, что Ленин никогда не говорил «религия - ... для народа» или «мы пойдём другим путём», да и многие другие фразы.
Но зато в 1899 году, в работе «Попятное направление в русской социал-демократии», он точно писал: «учиться, учиться и учиться».
Я решил последовать этому завету Ильича и… поплыл учиться дайвингу! 🤿
Всем рекомендую, это невероятно крутой опыт! Правда, уши потом приходят в себя ещё пару часов ⏰ - но оно того точно стоит.
С уважением,
Михаил Масягин
214
«На чилле, на расслабоне 😁»
Автор канала временно скрылся в отпуске, но уже с середины сентября (15-20 числа) будет шквал апдейтов: преподавание, диссертация, гранты и не только 🎉
Курение и употребление алкоголя вредит вашему здоровью! (поэтому оставьте это мне 😉)
С уважением,
Михаил Масягин
214
Что-то мой канал об IT стал превращаться в лайф-стайл... Пора это исправить! Третья лекция!
https://www.youtube.com/watch?v=IsdbGojdeK0
Хочу заметить, что на всех известных мне курсах по системному программированию довольно много времени уделяют многопоточной синхронизации, а вот многопроцессную никто не затрагивает. Исправим и это 🤓
На лекции обсудим:
- запуск процессов: fork, vfork, spawn;
- синхронизацию процессов:
- sockets & UNIX-sockets;
- pipes & named pipes;
- message queues;
- shared memory & mmaped-files;
- semaphores;
- устройство и работу shared memory:
- mutex, semaphore, condvar в shared memory;
- lock-free & address-free data structures...
- поговорим про замечательный фильм «Умница Уилл Хантинг» 😁
GitHub курса: https://github.com/masyagin1998/hp-systems-course
Полезные ссылки к лекции:
Хорошая история System V & POSIX:
https://www.opennet.ru/docs/RUS/os_unix/
man7:
https://man7.org/linux/man-pages/man2/mmap.2.html
https://man7.org/linux/man-pages/man2/pipe.2.html
https://man7.org/linux/man-pages/man3/mkfifo.3.html
https://man7.org/linux/man-pages/man3/mq_open.3.html
https://man7.org/linux/man-pages/man3/shm_open.3.html
https://man7.org/linux/man-pages/man2/futex.2.html
https://man7.org/linux/man-pages/man3/sem_open.3.html
futex (снова):
https://man7.org/linux/man-pages/man2/futex.2.html
Как shared memory используют большие дяди:
https://www.youtube.com/watch?v=8uAW5FQtcvE
P.S. Даже если Вы не системный программист, эти материалы могут быть для Вас очень полезны. Вы узнаете как реально работают под капотом системы, о которых мы так любим говорить на System Design Interview 👍
С уважением,
Михаил Масягин
214
«Ну что, работяги, волки вернулись с охоты!» 🐺
#профсоюзная
https://unionconf.ru/
Профсоюзная финишировала - огонь 🔥.
Маска волка, купленная в последний момент, отработала на все 100% (ладно, лисы… но какая разница 😅).
- Понетворкались с крутыми разработчиками, тимлидами, продактами и архитекторами.
- Подебатировали про менторство в IT - раскатали команду противников этого подхода 💪. Правда я сам не фанат этой темы, но уж что попалось на жеребьёвке, то и отстояли 😂
- А дальше - алкокодинг: решали LeetCode на скорость и на количество выпитого 🍺.
Антон - топовый спикер и организатор: всё по-взрослому, но при этом весело и драйвово.
P.S. На фото - 10 самых огненных людей конфы 🔥.
С уважением,
Михаил Масягин
214
«Ну что, работяги, пора становиться волками!» 🐺
#профсоюзная
https://unionconf.ru/
Я редко выбираюсь на конференции, но мимо такого события пройти не смог - IT-конференция Профсоюзная от Антона Назарова и «Осознанной меркантильности».
Скажу честно: история с одновременной тайной работой на нескольких работодателей мне не близка. У меня был другой опыт - почти три года я совмещал работу в американско-дубайском стартапе и российском ИБ, причём обе стороны знали друг о друге. Для меня «осознанная меркантильность» — это не про количество работодателей, а про уважение к своему времени, умение считать деньги и трезвый взгляд на профессию и карьеру 🚀.
Очень хочу послушать выступления Олега Козырева и Максима Аверина, так как и сам совместно с @voda_dev занимаюсь образованием в сфере IT 📚.
Если тоже окажетесь там - пишите, будет классно пересечься 👋
P.S. Говорят, там будет конкурс волчьих костюмов — может, прикупить маску?.. 😅🐺
С уважением,
Михаил Масягин
214
«System Design & Counter Strike»
Встретился с ребятами из System Design World — обсудили System Design, рынок IT в РФ в 2025, банки, HFT и стартапы. Обменялись мыслями и смешными историями из индустрии 🚀.
Для баланса сыграли вместе в VR-версию Counter Strike: я бегал с пулемётом и прикрывал @vova_dev, идущего с дробовиком в атаку на вражеские позиции 🔫! Никогда бы не подумал, что играя в CS можно вспотеть не меньше, чем в тренажёрном зале 😅
С уважением,
Михаил Масягин
214
Repost from System Design World
🧠💡 Транзакция в СУБД. Клеппманн 7 глава. BEGIN!
✔️ Что такое транзакция?
✔️ Составляющие ACID в реальности
✔️ Уровни изоляций в СУБД
✔️ Подробней о Read Commited
✔️ Особенности Репликации в контексте транзакций
✔️ Применение полученных знаний в System Design Интервью и на работе
✔️ Варианты прокачки в СУБД в контексте System Design
✅ COMMIT
⏱ Всё это за насыщенные 55 минут.
Автор разбора - Михаил Масягин.
Преподаватель System Design Интенсива.
👀 Смотреть - Youtube
214
Заглянул на огонёк к @vova_dev на канале System Design World!
Поговорили о траназакциях, выкинули букву I из ACID и узнали, что REPEATABLE READ в PostgreSQL вовсе и не REPEATABLE READ... 😅
Буду рад вашим просмотрам и комментариям под роликом на YouTube! ❤️
P.S. Дел было ооочень много, но скоро продолжу радовать вас новыми лекциями по системному программированию на своём канале 💪
С уважением,
Масягин Михаил
214
«Курсы & Мерч»
Как и положено любому уважающему себя айтишнику, добрую половину моего гардероба составляет «мерч» - худи, футболки, кепки, значки. Удобно и практично 😅
Пару дней назад пришли особенно ценные для меня экземпляры - футболка и стикеры курса по System Design от System Design World, где я выступал в роли соавтора: читал лекции по базам данных, делился опытом прохождения System Design Interview и, конечно, отвечал на вопросы. До этого я преподавал только в вузах, а тут - интенсивный практический курс для разработчиков с опытом. Было волнительно, но ни разу не пожалел! 💪
Курс получился живой и интересный: обсуждали как строить RAG'и и DWH, ругали CAP и PACELC, пытались чинить конфликты в multi-master'ах и холиварили на тему того, можно ли всё запихать в Neo4j 😂
Огромное спасибо @vova_dev за доверие и возможность поучаствовать в таком крутом проекте, а участникам - за вопросы и жаркие обсуждения!
P.S. Инсайд: второй поток на подходе 👀
С уважением,
Михаил Масягин
214
«FPGA & HFT»
Я ни разу не специалист в сфере FPGA, но за последние пару недель несколько подписчиков одновременно спрашивали меня о том, как FPGA используется в трейдинге. Делюсь с вами тем, что знал и что узнал 😅
FPGA (Field Programmable Gate Array) - это микросхема, в которой вы сами программируете логику на уровне логических блоков и соединений между ними. Если ядро CPU выполняет инструкции последовательно (опуская детали ILP и SIMD), то FPGA сразу раскладывает их в виде аппаратного конвейера, где множество операций идут параллельно, и с минимальными задержками.
Безусловно, передача данных между FPGA и CPU вносит дополнительную задержку, но грамотная архитектура с буферизацией, минимизацией пересылаемого объёма данных и zero-copy позволяет сделать оверхед пренебрежимо малым.
В HFT (High-Frequency Trading) FPGA чаще применяют для работы с классическими биржами, которые предоставляют коллокацию - размещение ваших торговых серверов в дата-центрах биржи, компактные бинарные протоколы и т.д., нежели с криптобиржами. На них можно эффективно реализовать:
- кодирование и декодирование маркет-даты (ITCH, OUCH и прочие бинарные данные);
- построение книги заявок;
- быстрые проверки лимитов и позиций до отправки заявки;
- генерацию несложных торговых сигналов и фильтрацию биржевых шумов;
- в отдельных случаях значительную часть торговой логики!
И всё это до того, как данные попадут на CPU!
К сожалению, есть у такого подхода и ряд существенных недостатков. Ключевые из них:
- сложность разработки и отладки, и, как следствие, значительное повышение time-to-market;
- проблемы с поиском FPGA-разработчиков - их рынок очень маленький, особенно по сравнению с нами - питонистами 😅;
- чрезвычайно (!!!) высокая стоимость FPGA-решений.
В комментариях приложены ссылки на статьи по теме и даже... пара русскоязычных вакансий на стыке FPGA и HFT, которые я нашёл ☺️
С уважением,
Михаил Масягин
214
«Экспертные заключения и котики»
Мне регулярно приходится получать экспертные заключения на статьи, которые мы публикуем с научным руководителем (Владимир Борисович, здравствуйте! 👋)
Обычно на факультете это занимает 2–3 недели. Причём обязательно нужно соединять парные листы канцелярской скрепкой и приклеивать на каждый титульный лист стикер с пояснением, для чего нужен документ.
В этот раз у меня были только стикеры с котиками 😺 — и… всё подписали меньше чем за неделю! Похоже, на факультете тоже любят котиков 🐈😻🐈⬛️
Своего рода лайф-хак 😁
С уважением,
Михаил Масягин
P.S. А ведь можно провести A/B-тест, подавая статьи с котиками и без, и сравнивать время их подписания. А потом написать об этом статью и... подать её тоже С КОТИКАМИ! 😺
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
