Ssylka

Внутреннее устройство и оптимизации кортежей в CPython

Кортежи в CPython представлены структурой PyTupleObject, которая включает в себя массив указателей на объекты и размер кортежа. Длина кортежа хранится в поле ob_size, что обеспечивает быстрый доступ к размеру за O(1). При создании кортежа, CPython использует механизм переиспользования памяти freelist для кортежей размером менее 20. Это позволяет ускорить аллокацию и деаллокацию. При создании и уничтожении кортежей вызываются функции tuple_alloc и tp_dealloc соответственно.
Внутреннее устройство и оптимизации кортежей в CPython
Изображение носит иллюстративный характер

В процессе создания кортежа, если размер не превышает 20, сначала проверяется наличие свободного кортежа подходящего размера в freelist. Если такой кортеж найден, он переиспользуется. В противном случае память выделяется динамически. При деаллокации, кортежи размером менее 20 могут быть добавлены в freelist, чтобы в будущем можно было переиспользовать их память. Этот процесс включает в себя уменьшение ссылок на объекты внутри кортежа и очистку памяти.

Несмотря на то, что кортежи в Python считаются неизменяемыми, в C-API существует возможность их изменения через функцию PyTuple_SetItem. Однако эту функцию рекомендуется использовать только при создании кортежей. Использование PyTuple_SetItem для изменения уже существующих кортежей считается нарушением правил. Функция проводит проверку счётчика ссылок.

В целях эксперимента, возможно мутировать кортежи напрямую, изменяя их память с помощью ctypes. Это демонстрирует внутреннюю мутабельность кортежей на уровне C, но крайне не рекомендуется к использованию в реальных проектах из-за потенциальных проблем. Разработчики CPython планируют сделать кортежи полностью неизменяемыми даже на уровне C-API, но на данный момент существуют проблемы обратной совместимости.


Новое на сайте

19142Почему сотни энергетических объектов по всему миру остаются критически уязвимыми перед... 19141Возможен ли бесконечный полет дронов благодаря новой системе лазерной подзарядки? 19140Химический анализ впервые подтвердил использование человеческих экскрементов в римской... 19139Как искусственный интеллект AnomalyMatch всего за два дня обнаружил 1300 неизвестных... 19138Какие три стратегических решения директора по информационной безопасности предотвратят... 19137Почему обнаруженные в SolarWinds Web Help Desk критические уязвимости требуют... 19136Древнейшие в мире ручные деревянные орудия возрастом 430 000 лет обнаружены в Греции 19135Как древнейший генетический диагноз раскрыл тайну жизни подростка-инвалида в каменном... 19134Способны ли новые рои искусственного интеллекта незаметно захватить человеческое сознание? 19133Могут ли сложные дипептиды зарождаться в ледяном вакууме космоса, становясь основой жизни... 19132Математическая модель метапознания наделяет искусственный интеллект способностью... 19131Безопасен ли ваш редактор кода после обнаружения вредоносного ИИ-расширения в... 19130Может ли гигантское облако испаренного металла скрывать второе солнце или секретную... 19129Как критическая уязвимость CVE-2026-22709 разрушает изоляцию в популярной библиотеке vm2? 19128Станет ли платформа n8n «отмычкой» для взлома всей корпорации из-за новых критических...