Warum Python ist viel langsamer als node.js bei Rekursion

7

Ich habe ein einfaches Fibonacci-Testprogramm geschrieben, um die Leistung von node.js und python zu vergleichen. Es stellt sich heraus, dass Python 5 Sekunden benötigt, um die Berechnung zu beenden, während Node.js in 200ms endet Warum läuft Python in diesem Fall so schlecht?

Python

%Vor%

node.js

%Vor%     
gleery 11.10.2013, 01:25
quelle

4 Antworten

13

Es ist nicht wirklich möglich, einen konstruierten Benchmark wie diesen aufzustellen und Ergebnisse zu erhalten, die nützlich genug sind, um pauschale Aussagen über die Geschwindigkeit zu machen; Das Benchmarking ist extrem komplex und in manchen Fällen können Laufzeiten sogar Teile Ihres Benchmarks komplett ausfiltern, weil sie erkennen, dass es schneller geht, was Sie sagen, was Sie tun wollen.

Aber unter dem Strich vergleichen Sie Python nicht mit node.js. Sie vergleichen ihre Interpreter: CPython mit V8. Python und Javascript haben ähnliche Sprachfunktionen, die sich auf die Leistung auswirken (Speicherbereinigung, dynamische Typen, sogar Heap-Zuweisung von ganzen Zahlen, denke ich?). Wenn Sie diesen Benchmark ausführen, ist es wirklich ein Shootout zwischen Interpretern.

Und obwohl Benchmarks wie diese in der Regel keinen Wert haben, hat die Frage "Warum ist V8 schneller als CPython für so etwas?" eine Antwort: es liegt an der JIT Compiler .

Wenn Sie also einen direkten Vergleich wünschen, sollten Sie Ihren Python-Code auf PyPy ausführen, bei dem es sich um einen Python-Interpreter mit einem JIT handelt. Oder versuchen Sie, Ihren JavaScript-Code auf einer Runtime ohne JIT auszuführen. An diesem Punkt werden Sie jedoch wahrscheinlich feststellen, dass Benchmarking zu schwierig und zu komplex ist, um ein Skript wie dieses zu verwenden, um eine Entscheidung darüber zu treffen, welche Sprache schneller ist.

    
Andrew Gorcester 11.10.2013 02:04
quelle
7

Node verwendet einen JIT-Compiler , der darauf hinweist, dass der gleiche Code-Block ausgeführt wird viele Male mit den gleichen Arten von Eingabe und kompilieren Sie es zu Maschinencode. Es ist möglich, dass Node überhaupt merkt, dass dies eine reine Funktion ist und einige der Ergebnisse enthält, aber aufgrund der Natur eines solchen Compilers ist es von außen kaum zu erkennen.

CPython ist ein naive Dolmetscher und wird genau das tun, was Sie ihm sagen. Es gibt jedoch einen Versuch, ein Python-JIT (nicht weniger geschrieben) zu schreiben, das PyPy genannt wird, und wie Sie sehen können Die bisherigen Ergebnisse sind vielversprechend:

%Vor%     
Eevee 11.10.2013 02:05
quelle
6

Wenn Sie eine fibonacci-Funktion in Python verwenden, werden Sie sehen, dass sie viel schneller wird:

%Vor%

Sie könnten das gleiche in javascript tun:

%Vor%

Es sieht so aus, als ob auf der JavaScript-Seite keine Leistungsverbesserung auftritt, was darauf schließen lässt, dass hier bereits eine Art Memo-Mechanismus eingebaut ist.

Danksagungen: Ссылка , Ссылка

    
Benjamin Toueg 11.10.2013 01:45
quelle
1

Ich hätte dies als Kommentar geschrieben, aber da ich noch nicht genügend Punkte dafür habe, habe ich eine andere Antwort hinzugefügt.

Wie eine Anzahl der Antworten / Kommentare

erwähnt haben

Frage, und ich dachte, ich würde ein Update für die neuesten Versionen von CPython und pypy führt den Python-Code aus der Frage:

  

Windows 7 64-Bit, Intel Xeon E5-1607 3GHz   U: & gt; Python --Version
  Python 2.7.5

  U: & gt; python fib.py
  9227465
3.54921930198

  U: & gt; pypy - version
  Python 2.7.3 (2cec7296d7fb, 12.11.2013, 13:24:40)
  [PyPy 2.2.0 mit MSC v.1500 32 bit]

  U: & gt; pypy fib.py
  9227465
0.385597246386

Also pypy ist zu diesem Zeitpunkt gerade mal 9 mal schneller als CPython in diesem Mikro-Benchmark. Es sieht immer noch so aus als ob node.js schneller wäre.

Prost, Tim.

    
timfoden 15.11.2013 10:21
quelle

Tags und Links