Un ndarray
stocke ses données dans un tampon de données contigu
Pour un exemple dans ma session ipython
actuelle :
In [63]: x.shape
Out[63]: (35, 7)
In [64]: x.dtype
Out[64]: dtype('int64')
In [65]: x.size
Out[65]: 245
In [66]: x.itemsize
Out[66]: 8
In [67]: x.nbytes
Out[67]: 1960
Le tableau référencé par x
a un bloc de mémoire avec des informations telles que shape
et strides
, et ce tampon de données qui occupe 1960 octets.
Identifier l'utilisation de la mémoire d'une liste, par exemple xl = x.tolist()
est plus difficile. len(xl)
est de 35, c'est-à-dire que son tampon de données a 35 pointeurs. Mais chaque pointeur référence une liste différente de 7 éléments. Chacune de ces listes a des pointeurs vers des nombres. Dans mon exemple, les nombres sont tous des entiers inférieurs à 255, donc chacun est unique (les répétitions pointent vers le même objet). Pour les entiers et les flottants plus grands, il y aura un objet Python séparé pour chaque. Ainsi, l'empreinte mémoire d'une liste dépend du degré d'imbrication ainsi que du type des éléments individuels.
ndarray
peut également avoir un type object
, auquel cas il contient également des pointeurs vers des objets ailleurs en mémoire.
Et une autre subtilité - le tampon de pointeurs principal d'une liste est légèrement surdimensionné, pour rendre append
plus rapide.