Ich arbeite in der Google App Engine-Umgebung und programmiere in Python. Ich erstelle eine Funktion, die im Wesentlichen eine Zufallszahl / Buchstabenfolge generiert und dann im Memcache speichert.
%Vor%Beeinflusst das Erstellen von zwei Funktionen anstatt nur eines großen die Leistung? Ich bevorzuge zwei, da es besser zu meinen Vorstellungen passt, aber es macht mir nichts aus, sie zu kombinieren, wenn das "Best Practice" ist.
Konzentrieren Sie sich darauf, Ihren Code lesen und verstehen zu können.
Wenn Sie ein Performance-Problem haben, schauen Sie sich an, was das Problem verursacht.
Die meisten Sprachen, einschließlich Python, haben einen relativ geringen Overhead für Methodenaufrufe. Wenn Sie diesen Code in eine einzige Funktion einbauen, wird dies die Performance-Metriken (dramatisch) nicht ändern - ich würde annehmen, dass Ihre Zufallsgenerierung wahrscheinlich den größten Teil der Zeit ausmachen wird und nicht über zwei Funktionen verfügt.
Das heißt, Splitting-Funktionen haben einen (sehr, sehr geringen) Einfluss auf die Performance. Allerdings würde ich es auf diese Weise denken - es kann Sie von 80 mph auf der Autobahn zu 79,99 mph bringen (was Sie nie wirklich bemerken). Die wichtigen Dinge, auf die man achten muss, sind das Vermeiden von Bremslichtern und Staus, da sie dazu führen, dass man ganz aufhören muss ...
In fast allen Fällen ist das "Inlining", um die Geschwindigkeit zu erhöhen, wie ein Haarschnitt, um Gewicht zu verlieren.
Reed hat Recht. Für die Änderung, die Sie in Betracht ziehen, sind die Kosten für einen Funktionsaufruf eine kleine Anzahl von Zyklen, und Sie müssten es 10 ^ 8 oder so pro Sekunde tun, bevor Sie es bemerken.
Allerdings würde ich vorsichtig sein, dass Leute oft zum anderen Extrem gehen, und dann ist es so, als ob Funktionsaufrufe teuer wären. Ich habe das in überdimensionierten Systemen gesehen, in denen es viele Schichten von Abstraktion gab.
Was passiert, wenn es eine menschliche Psychologie gibt, die sagt, wenn etwas leicht zu rufen ist, dann ist es schnell. Dies führt dazu, dass mehr Funktionsaufrufe als unbedingt erforderlich geschrieben werden. Wenn dies über mehrere Abstraktionsschichten geschieht, kann die Verschwendung exponentiell sein. Nach Reeds Fahrbeispiel kann ein Funktionsaufruf wie ein Umweg sein, und wenn der Umweg Umwege enthält, und wenn diese auch Umwege enthalten, wird sehr schnell viel Zeit verschwendet, für keinen
Wie andere gesagt haben, würde ich mir in diesem speziellen Szenario keine Sorgen machen. Der sehr kleine Overhead, der in Funktionsaufrufen enthalten ist, würde im Vergleich zu dem, was innerhalb jeder Funktion getan wird, verblassen. Und solange diese Funktionen nicht in schneller Folge aufgerufen werden, dürfte das sowieso nicht viel ausmachen.
Aber es ist eine gute Frage. In einigen Fällen ist es am besten, den Code nicht in mehrere Funktionen aufzuteilen. Wenn Sie beispielsweise mit mathematisch intensiven Aufgaben mit verschachtelten Schleifen arbeiten, sollten Sie möglichst wenige Funktionsaufrufe in der inneren Schleife ausführen. Das liegt daran, dass die einfachen mathematischen Operationen selbst sehr billig sind, und daneben kann der Funktionsaufruf-Overhead eine merkliche Leistungseinbuße verursachen.
Vor Jahren entdeckte ich, dass die Hypoten (Hypotenuse) -Funktion in der Math-Bibliothek, die ich in einer VC ++ - App verwendete, sehr langsam war. Es erschien mir lächerlich, weil es so einfach funktional ist - Return sqrt (a * a + b * b) - wie schwer ist das? Also schrieb ich mein eigenes und schaffte es, die Leistung um 16X zu verbessern. Dann fügte ich der Funktion das Schlüsselwort "inline" hinzu und machte es 3x schneller (ca. 50x schneller an diesem Punkt). Dann nahm ich den Code aus der Funktion und steckte ihn in meine Schleife selbst und sah noch eine weitere kleine Leistungssteigerung. Also ... ja, das sind die Arten von Szenarien, in denen Sie einen Unterschied sehen können.
Tags und Links python performance function google-app-engine