Thesetwo Fragen betreffen Verwendung von import
innerhalb einer Funktion vs. an der Spitze eines Moduls. Ich muss nicht überzeugt werden, meine Importe an die Spitze zu setzen, dafür gibt es gute Gründe. Um jedoch die technischen Probleme besser zu verstehen, möchte ich einen Follow-up bitten.Können Sie Importe in Funktionen mit Verschlüssen optimieren?
Können Sie das Beste aus beiden Welten performancetechnisch erzielen, indem Sie einen Verschluss verwenden und nur beim ersten Start der Funktion importieren?
Insbesondere nehme an, Sie Code haben, wie:
import sys
def get_version():
return sys.version
Sie auf den Import wollen nur dann geschehen, wenn die Funktion immer aufgerufen wird, so dass man es im Inneren bewegen:
def get_version():
import sys
return sys.version
Aber jetzt ist es langsam, wenn es ruft wird viel aufgerufen, so dass Sie etwas komplexer versuchen:
Jetzt zeigt zumindest eine grundlegende Performance-Test, dass diese letzte Option etwas langsamer ist als die erste (dauert ~ 110% so lang), aber viel schneller als die zweite (~ 20% so lang).
Erstens, funktioniert das tatsächlich? Zeigen meine Messungen genau, dass das zweite Beispiel mehr Arbeit leistet oder ein Artefakt dafür ist, wie ich die Dinge gemessen habe?
Zweitens, gibt es eine Verlangsamung von der Schließung - über das erste Mal, dass die Funktion ausgeführt wird?
Sie können den 'lru_cache'-Dekorator von' functools' verwenden, wenn es sich um eine Peer-Funktion handelt. Nicht sicher, ob es eine gute Idee ist oder nicht, aber es würde das Ergebnis der Funktion nach dem ersten Mal zwischenspeichern. – sytech
@sytech: Der 'lru_cache'-Cache-Test ist ziemlich schwer, ich bezweifle, dass er für etwas so Leichtes wie einen Import (der nach der anfänglichen Dateiladung nichts anderes ist, als einen Namen zu binden) eine Menge Leistung bringt. –