Почему максимальный размер контейнеров имеет знаковый бит? - PullRequest
0 голосов
/ 01 марта 2019

Я проверил справку для sys.maxsize в Python 3.6:

>>> help(sys)
[...]
maxsize -- the largest supported length of containers.

Тестирование:

In [10]: '{:,}'.format(sys.maxsize)
Out[10]: '9,223,372,036,854,775,807'

In [11]: math.log2(sys.maxsize)
Out[11]: 63.0

Это 63 бита, что предполагает бит начального знака.Однако длина контейнера не может быть отрицательной.

Что здесь происходит?

1 Ответ

0 голосов
/ 03 марта 2019

Максимальный размер контейнера был увеличен в Python 2.5 с 2 31 -1 до 2 63 -1. PEP 353: используя ssize_t в качестве типа индекса , который внес изменение, говорит :

Почему бы не size_t

Первоначальная попытка реализовать эту функцию пыталась использовать size_t.Быстро выяснилось, что это не может работать: Python использует отрицательные индексы во многих местах (чтобы указать отсчет с конца).Даже в местах, где size_t можно было бы использовать, слишком много переформулировок кода, где это необходимо, например, в таких циклах, как:

for(index = length-1; index >= 0; index--)

Этот цикл никогда не прекратится, если индекс изменяется с int на size_t.

Итак, ограничение проистекает из решения использовать специфический для Python тип «индексации», который было удобно определять как подписанный (ssize_t), а не беззнаковый (size_t), чтобы упростить обработку отрицательных индексов.

...