Kann man "import" rückgängig machen ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MrNiceTry
User
Beiträge: 80
Registriert: Samstag 7. November 2009, 10:32

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
Benutzeravatar
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
MrNiceTry
User
Beiträge: 80
Registriert: Samstag 7. November 2009, 10:32

Defnull hat geschrieben:Mach dir mal um Speicherverbrauch durch Laden von Modulen keine Sorgen. Das ist in den meisten Fällen absolut vernachlässigbar.
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.
Benutzeravatar
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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
MrNiceTry
User
Beiträge: 80
Registriert: Samstag 7. November 2009, 10:32

Danke für den kurzen Exkurs in die Python-Speicherverwaltung.

MrNiceTry
problembär

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
Klappt tadellos :P.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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]:
Was heißt denn tadellos?
[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]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

problembär hat geschrieben:

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
Klappt tadellos :P.
Vielleicht noch als zusätzliche Info warum das del nichts bringt ausser den Modulnamen aus dem aktuellen Namespace zu schmeißen:

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
http://docs.python.org/library/sys.html#sys.modules
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Hat ja sma schon geschrieben...
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

..und DasIch demonstriert bzw die mögliche Lösung gezeigt.
Antworten