Warum erstellen Sie eine Klasse in Python so viel langsamer als die Instanziierung einer Klasse?

Fand ich, dass die Einrichtung einer Klasse ist viel langsamer als Instanziierung einer Klasse.

>>> from timeit import Timer as T
>>> def calc(n):
...     return T("class Haha(object): pass").timeit(n)

<<After several these 'calc' things, at least one of them have a big number, eg. 100000>>

>>> calc(9000)
15.947055101394653
>>> calc(9000)
17.39099097251892
>>> calc(9000)
18.824054956436157
>>> calc(9000)
20.33335590362549

Yeah, erstellen 9000 Klassen dauerte 16 Sekunden und wird sogar noch langsamer als die nachfolgenden Aufrufe.

Und so:

>>> T("type('Haha', b, d)", "b = (object, ); d = {}").timeit(9000)

führt zu ähnlichen Ergebnissen.

Aber Instanziierung nicht leiden:

>>> T("Haha()", "class Haha(object): pass").timeit(5000000)
0.8786070346832275

5000000 Instanzen in weniger als einer Sek.

Was macht die Entwicklung teuer?

Ist und warum der Prozess der Erstellung langsamer werden?

EDIT:

Reproduzieren:

starten Sie eine frische python-Prozess, der erste von mehreren "calc(10000)"s geben eine Zahl von 0,5 auf meinem Rechner. Und versuchen, einige größere Werte, calc(100000), kann es nicht zu Ende, selbst in 10secs, es unterbrechen, und calc(10000), gibt eine 15sec.

EDIT:

Zusätzliche Tatsache:

Wenn Sie gc.sammeln ( - ) nach 'calc' wird langsam, Sie kann bekommen den 'normalen' Geschwindigkeit am Anfang, aber das timing wird zunehmend in nachfolgenden aufrufen

>>> from a import calc
>>> calc(10000)
0.4673938751220703
>>> calc(10000)
0.4300072193145752
>>> calc(10000)
0.4270968437194824
>>> calc(10000)
0.42754602432250977
>>> calc(10000)
0.4344758987426758
>>> calc(100000)
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "a.py", line 3, in calc
    return T("class Haha(object): pass").timeit(n)
  File "/usr/lib/python2.7/timeit.py", line 194, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyboardInterrupt
>>> import gc
>>> gc.collect()
234204
>>> calc(10000)
0.4237039089202881
>>> calc(10000)
1.5998330116271973
>>> calc(10000)
4.136359930038452
>>> calc(10000)
6.625348806381226
  • Warum ist das wichtig? In jedem Fall, Ihre timings sind betroffen von der Last auf Ihrem system zu der Zeit. Sie sind wirklich nur nützlich für Vergleiche durchgeführt, an so ziemlich der gleichen Zeit. Ich bekomme etwa 0,5 s für 9000 Klasse Kreationen.
  • es ist ein 1000x Unterschied.. warum bist du nit-Kommissionierung über die kleinen details?
  • Welche kleinen details? Diese Ergebnisse können nicht anderswo repliziert werden.
  • huh? natürlich können Sie nicht replizieren die genauen Werte ... aber die Größen sollten gleich sein (das argument der timeit ist das wichtigste hier!).
  • Ich bin neugierig auf die Verlangsamung als ich die erste Geschwindigkeit. Das ist eine ziemlich interessante (für mich) etwas kantiger Fall.
  • Nicht einmal die Größen, die unverändert bleiben sollten - timeit ist nur für relative tests. Der Punkt ist, dass der Test an anderer Stelle (wie auf ideone) zeigt, dass die Klasse die Schöpfung ist nicht sehr teuer. Dies ist ein nicht-Thema.
  • Siehe meine ideone-test. Keine Verlangsamung gezeigt.
  • Sie haben gerade bewiesen, dass OP hat einen langsameren computer als ideone. Gehen Sie versuchen, mit 5000000 Klasse Kreationen und vergleichen Sie es mit 5000000 Instanz Kreationen und sagen, uns ist es gleich schnell. Der Abstand verändert sich natürlich, der Punkt war, dass T(Schöpfung) > T(Instanziierung)
  • Nein, diese Frage kennzeichnet die Klasse der Schöpfung als sehr langsamer, und langsamer, wenn mehr tests durchgeführt werden. Aktuelle Tests haben gezeigt, dass es nicht sehr langsam und nicht langsamer zu werden. Was ich habe gezeigt ist, dass die OPs-Ergebnisse sind zweifelhaft.
  • ideone.com/UBvRf
  • very slow ist ein relativer Begriff, und offensichtlich abhängig von den maschinenparametern und den persönlichen Geschmack. java war very slow auf Maschinen, die vor 15 Jahren und jetzt haben Sie minecraft 😉
  • Was ist dein Punkt? Das zeigt nicht die Schöpfung als aus der Ferne so langsam wie OP ' s tests, und aus offensichtlichen Gründen, es sagt nichts über die Existenz eines Trends. Warum sind Sie verzweifelt, Sie zu verteidigen-Ergebnisse, die niemand replizieren kann?
  • Ich konnte repliziert es auf meinem pc, und während es ist nicht eine wachsende Tendenz, wird es um 2x langsamer nach Wiederholung des Tests in der Schleife, die für ~70 mal (springt von 0.22 s 0.49 s und macht dort weiter).
  • Richtig, dass wahrscheinlich nur zeigt die Fragmentierung des Speichers. All diese test zeigt, dass die Verteilung einer Menge von kleinen Objekten degradiert system-performance. Dies ist kein neues Ergebnis.
  • vielleicht solltest du da gepostet hast, die als Antwort statt zu streiten ist es nicht geschehen? OP war nicht fordern, keine neuen Entdeckungen, war er/Sie? edit: sehe nicht deine Letzte änderung.
  • Aber "es" nicht passiert - class-Kreation ist nicht besonders langsam, und es wird nur langsam unter völlig gekünstelt Bedingungen. Die Prämisse dieser Frage, ist schlichtweg falsch: Ihre Ergebnisse können nicht repliziert werden nach der Methode offengelegt, in Frage.
  • du bist also noch agruing, dass es nicht langsam (auch wenn das ein relativer Begriff und es IST langsamer in diesem Fall)? und du bist noch streiten, es wird nicht langsamer mit der Zeit, obwohl, du hast eine richtige Begründung dafür, warum es immer langsamer wird?
  • Ich behaupte, dass es nicht in der Tat langsam, unter jeder vernünftigen definition des Wortes, außer, wenn eine lächerlich große Anzahl von Klassen, die bereits existieren, und dass es nicht der Fall ist, die Klasse Kreation einzigartig macht-class-Kreation langsam. Sie analysieren etwas, was eigentlich gar nicht auftreten oder vorhanden sind.
  • Sie nur ersetzt ein relativer Begriff (langsam) mit einem anderen (zumutbaren). Ich Ruhe mein Fall.
  • Sie ruhen Ihrem Fall auf was genau? Vernünftig ist nicht ein relativer Begriff, und selbst wenn es so wäre, würde dies nicht zur Unwirksamkeit der Punkt, den ich mache. Noch einmal: der angebliche Phänomen einfach nicht vorhanden ist.
  • Ich kann es nicht reproduzieren, so wie Sie auf meinem 64-bit Ubuntu-Rechner mit Python 2.7. 10000 konsequent nimmt mit 0,28 Sekunden (±2%). Sicher, das tun von 20000 in einer Zeit, dauert drei mal so lange wie 10000 und so weiter (ich habe nicht die Mühe gemacht zu warten, für 100000), aber das entspricht nicht der ursprünglichen Stelle. Es suggeriert das es, obwohl.
  • > Warum die Erstellung von Klassen in Python zu langsam ist? Das ist es nicht. Es ist überhaupt nicht langsam. Zeigen Sie mir einen Fall, wo Sie brauchen, um zu erstellen mit 10.000 Klassen in einer solchen Art und Weise, wie diese und ich werde Ihnen zeigen, ein system umgesetzt, der falsche Weg.
  • Hier ist etwas zu kauen auf, ich habe gerade versucht OP:s-test auf meinem Rechner; calc(9000) gibt 4.38 (first run) und Mittelwerte auf 4.53 consequtive läuft. T("Haha()", "class Haha(object): pass").timeit(5000000) gibt 10.89 am ersten Lauf und im Durchschnitt auf 11.0 consequtive läuft. System Belastung ist null.
  • Das scheint zweifelhaft. Dauert es viele Minuten, um zu starten, ein python-Programm mit mehreren Klassen? Wenn nicht, schlägt Sie vor, dass Ihr test ist nicht repräsentativ für die tatsächliche Ausführung eines Programms.

InformationsquelleAutor Proton | 2012-04-09
Schreibe einen Kommentar