Из документации :
Документ - это последовательность объектов токена. Доступ к предложениям и именам
объекты, экспорт аннотаций в массивы, сериализация без потерь в
сжатые двоичные строки. Объект Doc содержит массив TokenC
Структуры. Объекты Token и Span уровня Python являются представлениями этого
массив, т.е. они сами не владеют данными.
Это имеет смысл, но мне любопытно узнать, как это работает именно под капотом, тем более что, как я покажу ниже, можно удалить объект Doc
(или, по крайней мере, переменную, указывающую на него) и продолжает работать.
import spacy
nlp = spacy.load('en_core_web_sm')
from sys import getsizeof
doc = nlp('King Henry VIII married six times.')
print(doc)
print(getsizeof(doc))
token = doc[0]
print(token)
print(getsizeof(token))
span = doc[:3]
del doc
span.merge() # This updates the vestigial doc despite deletion.
print(token)
print(getsizeof(token)) # Same size as before, being just a pointer.
print(token.doc) # Doc can be retrieved.
print(getsizeof(token.doc))
Выход:
King Henry VIII married six times.
184
King
80
King Henry VIII
80
King Henry VIII married six times.
184
Учитывая мои элементарные знания Python, мне интересно знать:
- Где и как объект
Doc
хранится в памяти именно для того, чтобы вышеуказанное работало.
- Если переменная
token
может вызывать этот объект со всеми его функциональными возможностями в 80 байтов, почему переменная doc
должна быть более чем вдвое больше размера при 184?