Ist es möglich ein importiertes Modul wieder zu entfernen?
z.B. wenn etwas importiert wird, was aber nur einmal am Anfang benutzt wird.
Was ist, wenn viele imports gemacht werden. Füllt sich der Speicher immer weiter ?
Hat Python eine Funktionalität die automatisch bereinigt?
Danke
MrNiceTry
Kann man "import" rückgängig machen ?
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Mach dir mal um Speicherverbrauch durch Laden von Modulen keine Sorgen. Das ist in den meisten Fällen absolut vernachlässigbar.
Bottle: Micro Web Framework + Development Blog
Wenn es sich bei der Anwendung um einen Webserver handelt, der viele differente Python-Seiten-Module hat, + der auch noch lange läuft, kann sich das aber ganz schön aufschaukeln.Defnull hat geschrieben:Mach dir mal um Speicherverbrauch durch Laden von Modulen keine Sorgen. Das ist in den meisten Fällen absolut vernachlässigbar.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Module brauchen Speicher für Klassen- und Funktionsdefinitionen (vernachlässigbar) und Variablen auf Modulebene (Bei sauber programmierten Modulen meistens ebenfalls vernachlässigbar). Wenn das Modul nicht irgendwas in den Modul-Namensraum müllt, hat die Laufzeit nichts mit dem Speicherverbrauch der Module zu tun. Und du kannst hunderte Module installieren, bevor das erste MB voll ist. Das Löschen von Modulen macht schlicht keinen Sinn, weswegen es auch ohne Tricks nicht gehen wird.
Bottle: Micro Web Framework + Development Blog
Python kümmert sich darum, dass Speicherplatz von Objekten, die nicht mehr benötigt werden (weil sie nicht mehr erreichbar sind), wieder freigegeben wird. Dann kann sofort oder aber auch später erst dann passieren, wenn Python danach ist. CPython zählt Referenzen, sodass es hier meist sofort der Fall ist.
Die globale Variable "foo", die durch "import foo" entsteht, könnte man mit "del foo" wieder löschen. Das entfernt jedoch nicht das Modul, da alle Module unter "sys.modules" in einem Dictionary stecken. Dort könnte man es mit "del sys.modules['foo']" entfernen. Ob das wirklich das Modul entfernt, kann ich nicht sagen, möglicherweise merkt sich CPython das noch irgendwo außerhalb von dem, wo ich in Python selbst hinkomme.
In der Regel muss man aber nicht löschen, denn die Anzahl der Module ist bei jedem vernünftigen Programm ja endlich und überschaubar. Jedes Modul wird maximal einmal geladen. Ein Webserver, der für jede Seite ein Modul hat kommt mir da eher ungewöhnlich vor.
Stefan
Die globale Variable "foo", die durch "import foo" entsteht, könnte man mit "del foo" wieder löschen. Das entfernt jedoch nicht das Modul, da alle Module unter "sys.modules" in einem Dictionary stecken. Dort könnte man es mit "del sys.modules['foo']" entfernen. Ob das wirklich das Modul entfernt, kann ich nicht sagen, möglicherweise merkt sich CPython das noch irgendwo außerhalb von dem, wo ich in Python selbst hinkomme.
In der Regel muss man aber nicht löschen, denn die Anzahl der Module ist bei jedem vernünftigen Programm ja endlich und überschaubar. Jedes Modul wird maximal einmal geladen. Ein Webserver, der für jede Seite ein Modul hat kommt mir da eher ungewöhnlich vor.
Stefan
Code: Alles auswählen
>>> import os
>>> print os.name
posix
>>> del os
>>> print os.name
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'os' is not defined

Code: Alles auswählen
In [1]: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
In [2]: del this
In [3]: import this
In [4]:
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Eine kleiner Änderung dann geht es wieder: http://bpaste.net/show/1781/. Ob dass in Kombination mit threading oder multiprocessing noch funktioniert weiß ich allerdings auch nicht, ich würde davon ausgehen dass es zumindest mit ersterem problematisch werden könnte.
Vielleicht noch als zusätzliche Info warum das del nichts bringt ausser den Modulnamen aus dem aktuellen Namespace zu schmeißen:problembär hat geschrieben:Klappt tadellosCode: Alles auswählen
>>> import os >>> print os.name posix >>> del os >>> print os.name Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'os' is not defined
.
Code: Alles auswählen
In [2]: import sys
In [3]: "datetime" in sys.modules
Out[3]: False
In [4]: import datetime
In [5]: del datetime
In [6]: "datetime" in sys.modules
Out[6]: True