Comment réduire l'utilisation de la mémoire de script Python
J'ai une très grande script python, 200K, que je tiens à utiliser le moins de mémoire possible. Il ressemble à quelque chose comme:
# a lot of data structures
r = [34, 78, 43, 12, 99]
# a lot of functions that I use all the time
def func1(word):
return len(word) + 2
# a lot of functions that I rarely use
def func1(word):
return len(word) + 2
# my main loop
while 1:
# lots of code
# calls functions
Si je mets les fonctions que j'utilise rarement dans un module, et de les importer dynamiquement seulement si nécessaire, je ne peux pas accéder aux données. C'est aussi loin que j'ai eu.
Je suis nouveau à python.
Quelqu'un peut-il me mettre sur le droit chemin? Comment puis-je briser cette grande script, de sorte qu'il utilise moins de mémoire? Est-ce la peine de mettre rarement utilisé de code en modules et en n'appelant en cas de besoin?
source d'informationauteur Coo Jinx
Vous devez vous connecter pour publier un commentaire.
Organzing:
Votre script python semble en effet être énorme, peut-être vous devriez envisager une réorganisation de votre premier code, de diviser en plusieurs des modules ou des paquets. Il sera probablement plus facile de le profilage de code et les tâches d'optimisation.
Vous voudrez peut-être avoir un coup d'oeil là:
Et éventuellement de:
Optimisation:
Il y a beaucoup de choses qui peut être fait pour l'optimisation de votre code ...
Par exemple, au sujet de vos structures de données ... Si vous faites une grosse utilisation de listes ou les listes des compréhensions, vous pourriez essayer de comprendre d'où avez-vous vraiment besoin de listes, et où ils pourraient être remplacés par des non-mutable structures de données comme les tuples ou par "volatile" objets "paresseux" conteneurs, comme générateur d'expressions.
Voir:
Sur ces pages, vous pourrez trouver quelques informations utiles et conseils:
Aussi, vous devez étudier vos façons de faire les choses et se demander s'il existe un moyen de faire moins avidement, de sorte qu'il est mieux de le faire en Python (vous trouverez quelques conseils dans la balise pythonic) ... C'est surtout vrai en Python, car en Python, il est souvent une "évidente" façon (et un seul) de faire des choses qui est mieux que les autres (voir Le Zen de Python), qui est dit être pythonic. Ce n'est pas spécialement lié à la forme de votre code, mais aussi - et surtout - pour les performances. Contrairement à beaucoup de langues, de promouvoir l'idée qu'il devrait y avoir plusieurs façons de faire quelque chose, Python préfère se concentrer sur la meilleure façon. Alors, évidemment, il y a plusieurs façons de faire quelque chose, mais souvent, on est vraiment mieux.
Maintenant, vous devriez également vérifier si vous êtes en utilisant les meilleures méthodes pour faire des choses, parce que pythonicality de ne pas organiser votre algorithmes pour vous.
Mais à la fin, c'est très selon votre code c'est difficile de répondre sans avoir vu.
Et, assurez-vous de prendre en compte les observations formulées par eumiro et Amr.
Cette vidéo peut vous donner quelques bonnes idées: http://pyvideo.org/video/451/pycon-2011---quot-dude--where--39-s-my-ram--quot-
Les conseils sur le générateur d'expressions et d'utiliser des modules est bon. L'optimisation prématurée des causes des problèmes, mais vous devriez toujours passer quelques minutes de réflexion au sujet de votre conception avant de s'asseoir pour écrire du code. Particulièrement si ce code est destiné à être réutilisé.
D'ailleurs, vous mentionnez que vous avez beaucoup de structures de données définies dans le haut de votre script, ce qui implique qu'ils sont tous chargés en mémoire au démarrage. Si c'est un très grand jeu de données, envisagez de déplacer des ensembles de données spécifiques, dans des fichiers séparés, et de le charger dans seulement comme nécessaire. (à l'aide de la
csv
module, ounumpy.loadtxt()
etc)Séparé en utilisant moins de mémoire, aussi se pencher sur les moyens d'utiliser plus efficacement la mémoire. Par exemple, pour les grands ensembles de données numériques, des tableaux numpy sont un moyen de stocker des informations qui permettront de fournir une meilleure performance dans vos calculs. Il est quelque peu datée conseils à http://wiki.python.org/moin/PythonSpeed/PerformanceTips
D'un transfert de fonctions autour ne changera pas votre utilisation de la mémoire. Dès que vous importez d'un autre module, il permettra de définir toutes les fonctions dans le module. Mais les fonctions ne prennent pas beaucoup de mémoire. Sont-ils extrêmement répétitif, peut-être vous pouvez avoir moins de code par les fonctions de refactoring?
@eumiro la question de droit: êtes-vous sûr que votre script utilise trop de mémoire? De combien de mémoire t-il, et pourquoi est-elle trop?