Frage

Ich verstehe, dass ein String in Python ist einfach ein Ausdruck und eine Zeichenfolge, die von selbst Müll sofort nach Rückgabe der Steuerung an einen Code des Anrufer gesammelt werden würde, aber ...

  1. Große Klasse / Methode doc Strings Ihr Code: Vergeuden sie Speicher durch den Bau von Objekten der String up?
  2. doc Modulebene Strings: sie sind gespeichert stufenlos vom Interpreter?

Ist egal, dies auch? Meine einzige Sorge war von der Idee, dass, wenn ich einen großen Rahmen wie Django oder mehrere große Open-Source-Bibliotheken verwenden, neigen sie dazu, mit potenziell mehrere Megabyte Text sehr gut dokumentiert werden. In diesen Fällen sind die in den Speicher geladen doc Strings für Code, der auf dem Weg verwendet wird, und dann dort gehalten, oder ist es gesammelt sofort wie normale Strings?

War es hilfreich?

Lösung

  • „Ich verstehe, dass eine Zeichenfolge in Python ist einfach ein Ausdruck und eine Zeichenfolge, die von selbst Müll sofort nach Rückgabe der Steuerung an einen Code des Anrufer gesammelt werden würde“ gibt ein Missverständnis, denke ich. Ein docstring ausgewertet einmal (nicht bei jedem Funktionsaufruf) und bleibt am Leben zumindest solange die Funktion der Fall ist.

  • "Ist diese Angelegenheit selbst?" wenn es um die Optimierung kommt nicht durch das Denken über sie abstrakt beantwortet, aber durch die Messung. „Mehrere Megabyte“ des Textes ist nicht wahrscheinlich nicht viel in einer speicherintensive Anwendung. Die Lösung für Speicher sparend wahrscheinlich anderswo lebt und Sie können bestimmen, ob das der Fall durch Messung ist.

  • Pythons -OO Befehlszeilenschalter entfernt Docstrings.

Andere Tipps

Python Docstrings sind standardmäßig um auf unbestimmte Zeit gehalten werden, da sie über das __doc__ Attribut einer Funktion oder eines Moduls zugänglich sind. Zum Beispiel mit den folgenden in test.py:

"""This is a test module."""

def f():
   """This is a test function."""
   pass

Dann:

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__doc__
'This is a test module.'
>>> test.f.__doc__
'This is a test function.'
>>> 

Die -OO Option offenbar an den Interpreter verursacht es Docstrings aus den erzeugten .pyo Dateien zu entfernen, aber es hat nicht den Effekt, den ich erwarten:

$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.py'
>>> 
$ grep "This is a test" /tmp/test.pyo
Binary file /tmp/test.pyo matches
$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.pyo'
>>> test.__doc__
'This is a test module.'
>>> 

Und in der Tat, die test.pyo Datei mit -OO erzeugt wird, ist identisch mit der test.pyc Datei ohne Befehlszeilenargumente generiert. Kann jemand dieses Verhalten erklären?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top