10
votes

Comment faire Python Faites de toutes les chaînes identiques à utiliser la même mémoire?

Duplicaté possible: strong>

Que fait Python stagiaire em > DO, et quand devrait-il être utilisé? P>

Je travaille avec un programme dans Python qui doit être corrélé sur un tableau avec des millions d'objets à chaîne. J'ai découvert que s'ils proviennent tous de la même chaîne cité, chaque "chaîne" supplémentaire est juste une référence à la première chaîne principale. Toutefois, si les chaînes sont lues à partir d'un fichier et que si les chaînes sont toutes égales, chacune nécessite encore une nouvelle allocation de mémoire. P>

C'est-à-dire, cela prend environ 14 pieds de stockage: P>

s = {"f11":"f11"}
a = [s["foo".replace("o","1")] for a in range(0,1000000)]


4 commentaires

@Maulwurfn, juste parce que la réponse est la même chose que la question est la même.


Pourquoi ne stockez-vous pas la valeur de remplacer l'opération d'abord?


Comment mesurez-vous la taille des listes? Si j'utilise sys.getsizeof (["FOO" pour une plage dans la plage (0.1000000)]) J'ai la même taille que sys.getsizeof (["FOO" (" o "," 1 ") pour une plage (0.1000000)]) - au moins en python 3.2


@Jbernardo, je n'ai pas stocké la valeur de l'opération d'abord parce que j'essayais intentionnellement de générer nouvelles chaînes , plutôt que beaucoup de références à une ancienne chaîne.


3 Réponses :


0
votes

Vous pouvez essayer quelque chose comme ceci:

[18632400, 18632160, 18632400, 18632160, 18651400, 18651440, 18651360, 18632400, 18651360]


1 commentaires

Bonne idée. Malheureusement, c'est un algorithme O (n ** 2) qui sera vraiment lent que la liste devient plus longue.



-1
votes

Garder un dictionnaire de chaînes vues devrait fonctionner xxx

(non testé)


0 commentaires

14
votes

juste faire un stagiaire () , qui indique à Python de stocker et de prendre la chaîne de la mémoire: xxx

Cela entraîne également environ 18 Mo, comme dans le Premier exemple.

Notez également le commentaire ci-dessous, si vous utilisez Python3. THX @BE KARPLUS


3 commentaires

Notez que dans Python 3, stagiaire a été renommé sys.Intern .


+1 Je n'ai pas connu sur stagiaire () .


Merci bien. Merci. Je ne savais pas sur stagiaire. Oui, j'utilise Python3, donc je devrai utiliser Sys.Intern ().