2016-03-22 2 views
2

sys.getsizeof возвращает другой размер для строки unicode для разных версий python.Метод python sys.getsizeof, возвращающий разные размеры в разных версиях python

sys.getsizeof(u'Hello World') возвращение 96 на Python 2.7.3 и возвращает 72 на Python 2.7.11

+2

выглядит как UCS4 и UCS2 строит – YOU

+1

@YOU да один был скомпилирован с UCS4 и другими с UCS2. Благодарю. – Saqib

ответ

2

sys.getsizeof дает вам деталь реализации, по определению, и ни одна из этих деталей не гарантированно остаются стабильными между версиями или даже строит.

Вряд ли что-то существенное изменилось между 2.7.3 и 2.7.11; Комментарий ВАС о ширине символов, вероятно, объясняет несоответствие; в том числе внутренний хранитель NUL-терминатора, есть 12 символов в Hello World, а для кодирования UCS4 потребуется еще 24 байта для их хранения, чем кодировка UCS2 (но взамен он может обрабатывать не BMP символов).

Другие вещи, которые могли бы изменить размер (в других обстоятельствах) были бы 32 против 64 бит строит (все указатели и ssize_t с двойной в размере на 64 бит строит, как это делают long с на машинах без Windows), Python 2 vs. Python 3 (Python 3 удалил единственное поле ширины указателя из заголовка общего объекта) и для str, Python 3.2 (в котором используется опция сборки, указанная фиксированная ширина UCS2 или UCS4 str, такая же, как Py2 unicode) по сравнению с Python 3.3+ (который uses one of three different fixed widths depending on the largest ordinal in the str, поэтому ASCII/latin-1 str использует один байт на символ, BMP str использует два, а не BMP str использует четыре, но также может кэшировать альтернативные представления, поэтому тот же str может увеличиваться или уменьшаться в «реальном «размер основан на использовании).

Смежные вопросы