Seite 1 von 1

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

Verfasst: Dienstag 29. Dezember 2009, 13:37
von MrNiceTry
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

Verfasst: Dienstag 29. Dezember 2009, 14:33
von Defnull
Mach dir mal um Speicherverbrauch durch Laden von Modulen keine Sorgen. Das ist in den meisten Fällen absolut vernachlässigbar.

Verfasst: Dienstag 29. Dezember 2009, 14:37
von MrNiceTry
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.

Verfasst: Dienstag 29. Dezember 2009, 14:57
von Defnull
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.

Verfasst: Dienstag 29. Dezember 2009, 15:00
von sma
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

Verfasst: Dienstag 29. Dezember 2009, 15:38
von MrNiceTry
Danke für den kurzen Exkurs in die Python-Speicherverwaltung.

MrNiceTry

Verfasst: Dienstag 29. Dezember 2009, 21:57
von 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.

Verfasst: Dienstag 29. Dezember 2009, 22:24
von jbs

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?

Verfasst: Dienstag 29. Dezember 2009, 23:51
von DasIch
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.

Verfasst: Mittwoch 30. Dezember 2009, 00:06
von Zap
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

Verfasst: Mittwoch 30. Dezember 2009, 09:33
von Darii
Hat ja sma schon geschrieben...

Verfasst: Mittwoch 30. Dezember 2009, 09:40
von snafu
..und DasIch demonstriert bzw die mögliche Lösung gezeigt.