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, но на данный момент существуют проблемы обратной совместимости.


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

18817Искусственный интеллект в математике: от олимпиадного золота до решения вековых проблем 18816Радиоактивный след в Арктике: путь цезия-137 от лишайника через оленей к коренным народам 18815Критическая уязвимость WatchGuard CVE-2025-14733 с рейтингом 9.3 уже эксплуатируется в... 18814Что подготовило ночное небо на праздники 2025 года и какие астрономические явления нельзя... 18813Зачем нубийские христиане наносили татуировки на лица младенцев 1400 лет назад? 18812Как увидеть метеорный поток Урсиды в самую длинную ночь 2025 года? 18811Кто стоял за фишинговой империей RaccoonO365 и как спецслужбы ликвидировали угрозу... 18810Как злоумышленники могут использовать критическую уязвимость UEFI для взлома плат ASRock,... 18809Как наблюдать максимальное сближение с землей третьей межзвездной кометы 3I/ATLAS? 18808Передовая римская канализация не спасла легионеров от тяжелых кишечных инфекций 18807Способен ли вулканический щебень на дне океана работать как гигантская губка для... 18806Зонд NASA Europa Clipper успешно запечатлел межзвездную комету 3I/ATLAS во время полета к... 18805Может ли перенос лечения на первую половину дня удвоить выживаемость при раке легких? 18804Новая китайская группировка LongNosedGoblin использует легальные облачные сервисы для... 18803Генетический анализ раскрыл древнейший случай кровосмешения первой степени в итальянской...