Я нашел _datetimemodule.c
, который кажется правильным файлом , но мне нужна небольшая помощь, так как C не моя сила.
>>> import datetime
>>> import sys
>>> d = datetime.datetime.now()
>>> sys.getsizeof(d)
48
>>> d = datetime.datetime(2018, 12, 31, 23, 59, 59, 123)
>>> sys.getsizeof(d)
48
Таким образом, объект datetime без учета часового пояса требует 48 байтов. Глядя на PyDateTime_DateTimeType
, кажется, что это PyDateTime_DateType
и PyDateTime_TimeType
. Может еще и _PyDateTime_BaseTime
?
Глядя на код, у меня сложилось впечатление, что для каждого поля в YYYY-mm-dd HH:MM:ss
хранится один компонент, что означает:
- Год: напр. int (например,
int16_t
будет 16-битным) - Месяц: например,
int8_t
- день: напр.
int8_t
- Час: напр.
int8_t
- Минута: напр.
int8_t
- Второй: напр.
int8_t
- Микросекунда: например.
uint16_t
Но это будет 2 * 16 + 5 * 8 = 72 бит = 9 байт, а не 48 байт, как мне говорит Python.
В чем мое предположение о внутренней структуре datetime неверно? Как я могу увидеть это в коде?
(Я предполагаю, что это может отличаться в разных реализациях Python — если да, сосредоточьтесь на cPython)
print(sys.getsizeof(d.year)) ; print(sys.getsizeof(d.month)) ; print(sys.getsizeof(d.day)) ; print(sys.getsizeof(d.hour)) ; print(sys.getsizeof(d.minute)) ; print(sys.getsizeof(d.second)) ; print(sys.getsizeof(d.microsecond))
печатает28
семь раз, а28 * 7
равно196
. - person DeepSpace   schedule 16.09.2018