Python

slots в Python

В этой статье рассматривается механизм slots в Python — незаменимый инструмент для тех, кто работает с большим количеством объектов. Вместо привычного хранения атрибутов в словаре dict, slots выделяет для каждого атрибута строго определенное место в памяти, что позволяет сократить использование ресурсов и ускорить работу программы. Однако, это накладывает определенные ограничения, например, нельзя добавлять новые атрибуты на лету. Примеры из практики показывают, как slots помогает экономить память в высоконагруженных системах и данных, таких как ML/ETL пайплайны и серверные приложения.

Читать далее


Как работают dict, slots и weakref в Python (и зачем это знать)

Разберем три ключевых механизма Python — dict, slots и weakref — и их роль в оптимизации работы с памятью, ускорении доступа к данным и предотвращении утечек. Рассмотрим, как стандартный dict может быть неэффективен при большом количестве объектов, а slots помогает снизить нагрузку, исключая лишние словари и фиксируя набор атрибутов. Также раскрывается, как слабые ссылки через weakref позволяют эффективно управлять памятью, не препятствуя удалению объектов сборщиком мусора. Примеры показывают, как комбинировать эти подходы для экономии памяти и гибкости работы с аттрибутами объектов.

Продолжение


Joblib: максимум из параллельных вычислений в Python

В этой статье объясняется, как библиотека Joblib ускоряет Python-код с помощью параллельных вычислений и кэширования. Рассматривается распараллеливание задач, таких как вычисления на больших данных, с использованием процессов и потоков. Также освещается работа с большими объемами данных через memory-mapped файлы и кэширование вычислений, чтобы избежать повторной работы. Joblib помогает ускорить выполнение задач, сокращая код и улучшая производительность.

Читать далее


Отладка с sys._getframe в Python

В коротком формате разберемся с тем, что же творится внутри CPython, когда функции вызывают друг друга: sys._getframef_backf_globalsf_locals, а также создадим свои декораторы.

Читать полностью


Аннотации типов в Python: коротко о главном

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

Читать далее


CPython C API: 5 вопросов на собеседовании

В статье рассматриваются важные вопросы по CPython и его C API, включая:

  1. Как Python взаимодействует с C через PyObject?
  2. Роль Py_INCREF() и Py_DECREF() в C-расширениях.
  3. Минимальный модуль на C для сложения чисел.
  4. Как работает Buffer Protocol и memoryview?
  5. Почему нельзя просто вызвать free(ptr) в C-коде с объектами Python?

Разобрать вопросы


Сериализация в Python с Pickle

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

Читать далее

Java

SOLID на котиках: коротко и по делу

Каждый разработчик знает, каково это — увидеть код, который страшно трогать. В нём всё ломается, стоит добавить пару строк. Чтобы такого не было, мир придумал SOLID — набор из пяти принципов, которые делают ваш код понятным, надёжным и лёгким в поддержке.

В этой статье рассмотрим, как внедрять эти принципы с умом, и да, будет немного котиков — куда без них.

Продолжение


3 вопроса на собеседование о многопоточности в Java

В этой статье мы рассмотрим три важнейших вопроса, которые могут возникнуть на собеседовании по многопоточности в Java. Проблемы, связанные с синхронизацией, правилами happens-before и особенностями работы с ConcurrentHashMap.computeIfAbsent(), обсудим всё это через примеры и практические рекомендации.

Читать далее


Как бросить исключение без throws в Java: технический разбор с примерами

В Java существует старое, но всё ещё актуальное ограничение: если метод бросает checked‑исключение (например, IOException), он обязан явно объявить это с помощью throws. Это требование — не от JVM, а от компилятора. Компилятор жёстко следит за декларациями, но вот JVM — нет. Что создаёт любопытную лазейку: обойти компилятор, оставаясь при этом в рамках спецификации JVM.

В этой статье разберёмся, как это сделать с помощью Unsafe.throwException(), почему это вообще работает, где это может пригодиться, и на что стоит обратить внимание при использовании Java 17, 21 и 24.

Продложение

C++

Линейная алгебра в C++ с Eigen

Кто хоть раз пытался работать с матрицами в C++, знает, что это удовольствие сродни написанию своего STL — возможно, но зачем? Eigen — это библиотека, которая избавит вас от ручного управления памятью, оптимизирует вычисления и позволит писать код, похожий на чистую математику. Поэтому в этой статье мы разберем эту прекрасную библиотеку.

Перейти к статье


Range-v3 в C++

В этой статье рассмотрим Range-v3 — библиотеку, которая изменила подход к обработке последовательностей в C++ и стала основой для std::ranges в C++20. Это библиотека, расширяющая стандартную библиотеку C++ возможностью работать с диапазонами вместо begin()/end(). В основе идеи лежат три концепции:

  1. Views — ленивые представления данных
  2. Actions — eager-операции над контейнерами
  3. Pipeline (|) — декларативный синтаксис для обработки последовательностей

Продолжение

Golang

Алгоритм Кнута-Морриса-Пратта для поиска подстрок на Go

Поиск подстроки в строке — важная задачка в текстовой обработке. В Go стандартная библиотека имеет strings.Index, но он использует простой перебор символов, который работает с O(n × m) в худшем случае, где n — длина текста, m — длина подстроки.

Алгоритм Кнута-Морриса-Пратта решает эту проблему, используя префикс-функцию, которая позволяет пропускать заведомо ненужные сравнения. В результате его сложность O(n + m), что делает его подходящим для больших текстов и множественных поисковых запросов.

Продолжение


FissionGo: как запускать Go-функции в Kubernetes

В этой статье мы разберём фреймворк FissionGo, который упрощает работу с серверлес-функциями в Kubernetes. С помощью FissionGo можно писать Go-функции, загружать их в Kubernetes, привязывать триггеры и запускать без необходимости работать с контейнерами или YAML-манифестами. Мы рассмотрим, как установить Fission, создать простые HTTP-функции и управлять их ресурсами, а также кэшировать данные с помощью Redis для улучшения производительности.

Перейти к статье


Интерактивный тур по Go 1.24

В Go 1.24 появилось множество полезных обновлений, включая обобщённые псевдонимы типов, улучшенные слабые указатели и финализаторы. Также значительно оптимизирована работа с map, что ускоряет операции с большими коллекциями. Были добавлены новые функции для тестирования и бенчмаркинга, улучшая работу с конкурентным кодом. К тому же, релиз включает поддержку SHA-3 и другие криптографические улучшения, повышающие производительность и удобство работы с языком.

Читать полностью


Реализация Paxos на Go: создаем алгоритм консенсуса без готовых решений

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

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

Читать далее

Программирование: подборка лучших статей из блога Otus на Хабр