2010-08-06 3 views
5

J'essaye d'adapter la structure sous-jacente du code de traçage (matplotlib) qui est mise à jour sur un temporisateur pour passer de l'utilisation de listes Python pour les données de tracé à l'utilisation de matrices numpy. Je veux être capable de réduire le plus possible le pas de temps pour l'intrigue, et comme les données peuvent atteindre des milliers de points, je commence à perdre rapidement un temps précieux si je ne le peux pas. Je sais que les tableaux numpy sont préférés pour ce genre de choses, mais j'ai du mal à comprendre quand je dois penser comme un programmeur Python et quand je dois penser comme un programmeur C++, maximiser mon efficacité d'accès à la mémoire.Comment la récupération de place Pythonic avec numpy array est-elle ajoutée et supprimée?

Il est indiqué dans les docs scipy.org pour la fonction append() qu'il renvoie une copie des tableaux ajoutés ensemble. Toutes ces copies sont-elles correctement récupérées? Par exemple:

import numpy as np 

a = np.arange(10) 
a = np.append(a,10) 
print a

C'est ma lecture de ce qui se passe sur le C++ - niveau, mais si je savais ce que je parlais, je ne poserais pas la question, donc s'il vous plaît me corriger si je Je me trompe! = P

Tout d'abord, un bloc de 10 entiers est alloué, et le symbole a pointe au début de ce bloc. Ensuite, un nouveau bloc de 11 entiers est alloué, pour un total de 21 ints (84 bytes) étant utilisé. Ensuite, le pointeur a est déplacé au début du bloc 11-int. Ma supposition est que ceci aboutirait à ce que l'algorithme de collecte des ordures décrémente le compte de référence du bloc 10-int à zéro et le désaffecte. Est-ce correct? Si ce n'est pas le cas, comment puis-je m'assurer de ne pas créer de surcharge lors de l'ajout?

Je ne suis pas sûr de savoir comment supprimer correctement un tableau numérique quand j'ai fini de l'utiliser. J'ai un bouton de réinitialisation sur mes parcelles qui rince simplement toutes les données et recommence. Quand j'avais des listes, cela a été fait en utilisant del data[:]. Y a-t-il une fonction équivalente pour les tableaux numpy? Ou devrais-je juste dire data = np.array ([]) et compter sur le garbage collector pour faire le travail pour moi?

Répondre

10

Le but de la gestion automatique de la mémoire est de ne pas y penser. Dans le code que vous avez écrit, les copies seront bien récupérées (il est presque impossible de confondre la gestion de la mémoire de Python). Toutefois, étant donné que np.append n'est pas en place, le code créera un nouveau tableau en mémoire (contenant la concaténation de a et 10), puis la variable a sera mise à jour pour pointer vers ce nouveau tableau. Puisque a ne pointe plus vers le tableau original, qui avait un refcount de 1, son refcount est décrémenté à 0 et il sera nettoyé automatiquement. Vous pouvez utiliser gc.collect pour forcer un nettoyage complet.

La force de Python ne réside pas dans l'accès à la mémoire de réglage fin, bien qu'il soit possible d'optimiser. Vous êtes probablement mieux trié en préaffectant a (en utilisant par exemple a = np.zeros(<size>)); Si vous avez besoin d'un réglage plus fin que cela, il commence à devenir un peu poilu. Vous pouvez jeter un oeil à la Cython + Numpy tutorial pour une manière très nette et facile d'intégrer C avec Python pour l'efficacité.

Les variables en Python pointent vers l'emplacement où leur contenu est stocké; vous pouvez del n'importe quelle variable et cela diminuera le nombre de références de sa cible de un. La cible sera nettoyée automatiquement une fois que son compteur de références aura atteint zéro. La morale de ceci est, ne vous inquiétez pas de nettoyer votre mémoire. Cela va arriver automatiquement.

+0

Donc, fondamentalement, je dois me détendre. =) Merci pour la clarification, je pensais que c'était comme ça que les choses marchaient mais je n'étais pas 100% clair à ce sujet. – pr0crastin8r

Questions connexes