Ist Python-code mit Klassen langsamer?
Als ich anfing, lernen Python erstellt habe ich ein paar Anwendungen ohne Klassen (nur Funktionen),
jetzt weiß ich, Klassen und wissen, dass der code würde viel lesbarer (und leicht verständlich), wenn würde ich umschreiben, dass es mit Klassen.
Wird der code sehr viel langsamer als ich wird die Verwendung von Klassen im Allgemeinen?
- Es ist wahrscheinlich, hängen einige, wie Sie es umsetzen und was sind Ihre Funktionen tun. Könnten Sie ein paar tests machen Sie sich mit dem timing-Modul.
- Die Frage ist viel zu allgemein, um beantwortet werden, sinnvoll. Diese variieren stark von Anwendungsfall zu Anwendungsfall. Einfach mal ausprobieren und Messen. Stellen Sie außerdem sicher, dass die Leistung ist tatsächlich ein Problem.
- wenn die performance-Einbußen (wenn überhaupt) aus der Verwendung von Klassen war von Bedeutung für Sie, dann sollten Sie wahrscheinlich nicht verwenden python in den ersten Platz. Keine Sorge, über solche kleinen Details. Die Lesbarkeit des Codes ist ein viel wichtiger Faktor als die Leistung in 99% der Fälle.
- Und falls Sie sich Wundern, wie man es Messen: docs.python.org/library/timeit.html
- Du bist mit Python und man sich Gedanken über performance auf solch einem Niveau? Es ist nicht, vor allem nicht im Allgemeinen. Aber auch wenn alles lief 2x langsamer mit Klassen, alle anderen Vorteile würde es mehr als Wert.
- Ich bin nicht warying, ich bin nur interessiert, was die Kosten der Lesbarkeit und dieser Ebene der Abstraktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht.
Im Allgemeinen werden Sie nicht bemerken einen Unterschied in der Leistung basiert auf der Verwendung von Klassen oder nicht. Die verschiedenen code-Strukturen impliziert, kann bedeuten, dass man schneller ist als die andere, aber es ist unmöglich zu sagen, welche.
Immer code schreiben zu Lesen, dann, wenn, und nur wenn, es ist nicht schnell genug, damit es schneller geht. Denken Sie daran: Vorzeitige Optimierung ist die Wurzel allen übels.
Um die Frage zu beantworten: ja, es ist wahrscheinlich ein wenig langsamer, alles andere gleich. Einige Dinge, die verwendet werden, um Variablen (einschließlich Funktionen) werden Objekt-Attribute und der
self.foo
ist immer etwas langsamer alsfoo
unabhängig davon, obfoo
war ein globales oder lokales ursprünglich. (Lokale Variablen zugegriffen wird, die durch den index, und die globals nach name, sondern ein Attribut-lookup auf ein Objekt ist entweder eine lokale oder eine Globale lookup, plus eine zusätzliche Suche nach Namen für das Attribut, ggf. in mehreren Orten.) Aufrufen einer Methode ist auch etwas langsamer als der Aufruf einer Funktion-es ist nicht nur langsamer das Attribut, es ist auch langsamer, um den Anruf zu machen, denn eine Methode ist ein wrapper-Objekt, ruft die Funktion, die Sie schrieb, was einen zusätzlichen Funktionsaufruf-overhead.Wird dies spürbar sein? In der Regel nicht. In seltenen Fällen kann es sein, sagen, wenn Sie Zugriff auf ein Objekt-Attribut eine Menge (Tausende oder Millionen mal) in einer bestimmten Methode. Aber in diesem Fall können Sie nur zuweisen
self.foo
auf eine lokale variablefoo
an der Spitze der Methode, und referenzieren Sie Sie, indem Sie den lokalen Namen hindurch, um wieder 99.44% der lokalen variable performance-Vorteil.Darüber hinaus gibt es einigen overhead für die Zuweisung von Speicher für die Instanzen, die Sie wahrscheinlich nicht haben, bevor, aber es sei denn, Sie sind ständig auf der erstellen und zerstören von Instanzen, ist dies wahrscheinlich eine einmalige Kosten.
Kurzum: es wird ein wahrscheinlich-Moll-Leistungs-hit ist, und wo der performance-hit ist mehr als gering, es ist leicht zu entschärfen. Auf der anderen Seite, das Sie retten könnte Stunden in schreiben und den code zu verwalten, vorausgesetzt, Ihr problem eignet sich, um eine Objekt-orientierte Lösung. Und Zeit sparen ist wahrscheinlich, warum bist du mit einer Sprache wie Python zu beginnen.
Donald Knuth, einer der großen alten Köpfe der informatik, gutgeschrieben mit der Bemerkung, dass "Wir sollten nicht vergessen über kleine efficiencies, say about 97% of the time: premature optimization is the root of all evil." Die Entscheidung, zu verwenden prozedurale Techniken eher als Objekt-orientiert sind, auf der Grundlage der Geschwindigkeit erhält, kann auch nicht realisiert werden, ist eh keine sinnvolle Strategie.
Wenn Ihr code funktioniert und nicht geändert werden müssen, dann fühlen Sie sich frei, es zu verlassen, allein. Wenn muss es geändert werden, dann sollten Sie überlegen, eine vernünftige Umgestaltung auf Klassen, da die Lesbarkeit des Programms wesentlich wichtiger ist als die Schnelligkeit bei der Entwicklung. Sehen Sie auch Vorteile in der verbesserten Wartbarkeit. Eine alte Säge von Kernighan und Plauger s "Elements of Programming Style" immer noch gilt:
Aber, zuerst und vor allem gehen für die Lesbarkeit. Ernst.
Du wahrscheinlich don ' T care so viel wie Sie denken, Sie tun.
Wirklich.
Sicher, code mit den Klassen vielleicht ein wenig langsamer durch Dereferenzierung. Vielleicht. Das ist das, was die JIT-Kompilierung ist, oder? Ich kann mich nie daran erinnern, welche Versionen von python dies tun und welche nicht, weil:
Leistung spielt keine Rolle.
Mindestens Konstante performance-Unterschiede, wie diese. Es sei denn, Sie tun eine ganze Menge von Berechnungen (Sie nicht!), verbringen Sie mehr Zeit in die Entwicklung/debugging/Pflege code. Optimierung für, die.
Wirklich. Weil Sie nie in der Lage sein, um den Unterschied Messen, es sei denn, Sie sind in einer engen Schleife. Und Sie wollen nicht zu tun, dass in python sowieso, es sei denn, Sie nicht wirklich über die Zeit. Es ist nicht wie Sie versuchen, das Gleichgewicht Ihrer segway in python, richtig? Sie wollen einfach nur, um zu berechnen, einige zahlen, richtig? Ihr computer wirklich gut an. Trust it.
Gesagt, dies bedeutet nicht, die Klassen sind der Weg zu gehen. Nur, die Geschwindigkeit ist nicht die Frage, die Sie stellen sollten. Versuchen Sie stattdessen, herauszufinden, was die Darstellung wird das beste für deinen code. Es scheint, jetzt wissen Sie Klassen, Sie schreiben sauberen code in OO-Mode. Gehen Sie voran. Lernen. Iterieren.