[PYTHON] Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas

Le bloc de données de Pandas est pratique, mais je ne suis pas sûr de la gestion de la mémoire. J'étais curieux de savoir où et comment il était réellement placé, alors je l'ai recherché.

Méthode d'enquête

import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3.0, 4.0], 'C': [5, 6]})
for block in df._data.blocks:
    memory_address = block.values.__array_interface__['data'][0]
    memory_hex = block.values.data.hex()
    print(f"({id(block)}) {block}")
    print(f"<{memory_address}> {memory_hex}")
    print()
(4886642416) FloatBlock: slice(1, 2, 1), 1 x 2, dtype: float64
<140474854679968> 00000000000008400000000000001040

(4886642608) IntBlock: slice(0, 4, 2), 2 x 2, dtype: int64
<140474585659872> 0100000000000000020000000000000005000000000000000600000000000000

Le nombre entre le crochet angulaire est l'adresse mémoire et le nombre qui suit est la représentation hexadécimale de la valeur mémoire. Puisque les colonnes A et C sont toutes deux des valeurs Int, vous pouvez voir qu'elles sont allouées collectivement en mémoire. Je vois?

Structure de données

La trame de données gère des blocs de données via une classe appelée BlockManger. L'idée autour de ceci est l'article "[Une feuille de route pour des structures de données scientifiques riches en Python](https://wesmckinney.com/blog/a-roadmap-for-rich-scientific-data-structures-in-python/] par l'auteur de Pandas. ) »Est facile à comprendre.

Si vous suivez le type de variable qui apparaît dans le code ci-dessus, ce sera comme suit.

Vous pouvez voir que le bloc contient le ndarray de NumPy. Donc, à partir de maintenant, c'est le monde de NumPy, "2.2. Advanced NumPy - Notes de cours Scipy Vous pouvez obtenir l'adresse mémoire avec ndarray .__ array_interface__ ['data'] [0]. Et puisque vous pouvez obtenir la vue de la mémoire avec ndarray.data, vous pouvez également regarder la valeur de la mémoire.

Notez que lorsque vous imprimez le memoryview, il est affiché sous la forme «<mémoire à 0x11b6a3ad0>», mais c'est l'adresse de l'instance de memoryview, qui est différente de l'adresse de la valeur. Pour plus d'informations, consultez «[Numpy, Python3.6 --not capable de comprendre pourquoi l'adresse est différente? --Stack Overflow](https://stackoverflow.com/questions/52032545/numpy-python3-6-not-able-to-understand-" pourquoi-l'adresse-est-différente) ».

Expérience

Faisons quelques opérations simples de trame de données et expérimentons comment l'allocation de mémoire change.

df1 = df[0:1]
(4886726416) FloatBlock: slice(1, 2, 1), 1 x 1, dtype: float64
<140474854679968> 0000000000000840

(4886727088) IntBlock: slice(0, 4, 2), 2 x 1, dtype: int64
<140474585659872> 01000000000000000500000000000000

Le premier est la tranche de la première ligne. Vous pouvez voir que l'adresse mémoire n'a pas changé et que la plage de référence est devenue plus courte. L'instance de bloc a changé.

df2 = df[1:2]
(4886798416) FloatBlock: slice(1, 2, 1), 1 x 1, dtype: float64
<140474854679976> 0000000000001040

(4886798896) IntBlock: slice(0, 4, 2), 2 x 1, dtype: int64
<140474585659880> 02000000000000000600000000000000

C'est la tranche sur la deuxième ligne. Puisque toutes les adresses mémoire sont +8, vous pouvez voir qu'elles se réfèrent au même bloc mémoire simplement en déplaçant le pointeur.

df['D'] = [True, False]
(4886642416) FloatBlock: slice(1, 2, 1), 1 x 2, dtype: float64
<140474854679968> 00000000000008400000000000001040

(4886642608) IntBlock: slice(0, 4, 2), 2 x 2, dtype: int64
<140474585659872> 0100000000000000020000000000000005000000000000000600000000000000

(4886800144) BoolBlock: slice(3, 4, 1), 1 x 2, dtype: bool
<140474855093504> 0100

Ajoutez une colonne. Pour les colonnes existantes, non seulement l'adresse mémoire, mais également le bloc ne change pas.

df3 = df.append(df)
(4886726224) IntBlock: slice(0, 1, 1), 1 x 4, dtype: int64
<140474855531008> 0100000000000000020000000000000001000000000000000200000000000000

(4509301648) FloatBlock: slice(1, 2, 1), 1 x 4, dtype: float64
<140474585317312> 0000000000000840000000000000104000000000000008400000000000001040

(4509301840) IntBlock: slice(2, 3, 1), 1 x 4, dtype: int64
<140474585630688> 0500000000000000060000000000000005000000000000000600000000000000

(4509301552) BoolBlock: slice(3, 4, 1), 1 x 4, dtype: bool
<140474855008224> 01000100

J'ai essayé de combiner les lignes. La disposition de la mémoire a radicalement changé. Il existe également deux IntBlocks. Cela provoque une fragmentation, alors j'aimerais que vous le mettiez ensemble au bon moment.

df4 = df3._consolidate()
(4509301552) BoolBlock: slice(3, 4, 1), 1 x 4, dtype: bool
<140474855008224> 01000100

(4509301648) FloatBlock: slice(1, 2, 1), 1 x 4, dtype: float64
<140474585317312> 0000000000000840000000000000104000000000000008400000000000001040

(4886728240) IntBlock: slice(0, 4, 2), 2 x 4, dtype: int64
<140475125920528> 01000000000000000200000000000000010000000000000002000000000000000500000000000000060000000000000005000000000000000600000000000000

Quand j'ai appelé la méthode privée _consolidate (), les valeurs Int ont été regroupées et placées à la nouvelle adresse mémoire.

Recommended Posts

Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Comment savoir s'il y a une valeur dans "quelque part" de pandas DataFrame
Comment calculer la volatilité d'une marque
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
[Ubuntu] Comment supprimer tout le contenu du répertoire
Comment trouver le nombre optimal de clusters pour les k-moyennes
Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
Combinez des listes dans un DataFrame avec des pandas
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment connecter le contenu de la liste dans une chaîne de caractères
Trouvez la définition de la valeur de errno
Comment trouver la quantité moyenne d'informations (entropie) de la distribution de probabilité d'origine à partir de l'échantillon
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
python / pandas / dataframe / Comment obtenir la ligne / colonne / index / colonne la plus simple
[Python] Comment ajouter des lignes et des colonnes à une table (pandas DataFrame)
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
[NNabla] Comment supprimer le niveau intermédiaire d'un réseau prédéfini
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
[Python] Résumé de l'utilisation des pandas
Comment réattribuer un index dans pandas dataframe
[Pandas] Développer les chaînes de caractères en DataFrame
[Pandas_flavor] Ajouter une méthode de Pandas DataFrame
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Comment obtenir un nom de colonne et un nom d'index spécifiques avec Pandas DataFrame
Comment connaître le nombre de processeurs sans utiliser la commande sar
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Un mémorandum sur la façon d'écrire des pandas que j'ai tendance à oublier personnellement
[NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné
Comment mettre un numéro de ligne au début d'un fichier CSV
[Python] Comment lire le fichier csv (méthode read_csv du module pandas)
Comment trouver une colonne d'un type spécifique (str, float, etc.) à partir d'une colonne dans un DataFrame
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Trouver la main de "Millijan" par l'optimisation des combinaisons
Trouvez le nombre de jours dans un mois
Découvrez la fraction de la valeur saisie en python
Comment trouver la corrélation pour les variables catégorielles
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
Découvrez comment diviser uniformément un fichier avec un certain nombre de lignes
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
[NNabla] Comment obtenir la sortie (variable) de la couche intermédiaire du réseau construit
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
[python] Comment trier par le Nth Mth élément d'un tableau multidimensionnel
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
[Numpy, scipy] Comment calculer la racine carrée d'une matrice Elmeet à valeur semi-régulière
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python