Pyston ist eine kompatible Implementierung von Python 2.7, die mit DropBox erstellt wurde. Es scheint, dass die Implementierung gefördert wird, um die Leistung mithilfe von LLVM und moderner JIT-Technologie zu verbessern. Weitere Informationen finden Sie im folgenden Artikel.
With those caveats, Pyston generally is able to beat CPython’s performance, but still lags behind PyPy.
"Leistung besser als CPython, aber nicht so gut wie PyPy."
Übrigens scheint es, dass es derzeit auf die Plattform der Ubuntu + x86_amd64-Umgebung abzielt.
Derzeit (Stand: 15. April 2014) wird die Binärdatei nicht veröffentlicht, daher müssen Sie sie selbst erstellen. Sie können es grob erstellen, indem Sie sich auf Folgendes beziehen.
Ich habe versucht, mit Vagrant eine Umgebung zu erstellen.
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"
Fast wie dokumentiert.
Holen Sie sich den Code von Github
$ sudo apt-get install git
$ cd ~/
$ git clone https://github.com/dropbox/pyston.git
$ mkdir ~/pyston_deps
$ sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev make build-essential libtool zip gcc-multilib autogen
$ cd ~/pyston_deps
$ wget 'http://www.netgull.com/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2'
$ tar xvf gcc-4.8.2.tar.bz2
$ mkdir gcc-4.8.2-{build,install}
$ cd gcc-4.8.2-build
$ ../gcc-4.8.2/configure --disable-bootstrap --enable-languages=c,c++ --prefix=$HOME/pyston_deps/gcc-4.8.2-install
$ make -j4
$ make check
$ make install
ccache
$ sudo apt-get install ccache
Fügen Sie die folgende Zeile zu ~ / pyston / src / Makefile.local hinzu, wenn Sie sie nicht verwenden
USE_CCACHE := 0
$ sudo apt-get install libncurses5-dev zlib1g-dev
LLVM + clang
$ cd ~/pyston_deps
$ git clone http://llvm.org/git/llvm.git llvm-trunk
$ git clone http://llvm.org/git/clang.git llvm-trunk/tools/clang
$ cd ~/pyston/src
$ make llvm_up
$ make llvm_configure
$ make llvm -j4
libunwind
$ cd ~/pyston_deps
$ wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz
$ tar xvf libunwind-1.1.tar.gz
$ mkdir libunwind-1.1-install
$ cd libunwind-1.1
$ ./configure --prefix=$HOME/pyston_deps/libunwind-1.1-install --enable-shared=0
$ make -j4
$ make install
$ ldconfig
valgrind
Laut dem Installationsdokument ist apt alt, daher heißt es, dass Sie aus dem Quellcode erstellen sollten Ich werde es gehorsam von der Quelle einfügen.
$ cd ~/pyston_deps
$ wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
$ tar xvf valgrind-3.9.0.tar.bz2
$ mkdir valgrind-3.9.0-install
$ cd valgrind-3.9.0
$ ./configure --prefix=$HOME/pyston_deps/valgrind-3.9.0-install
$ make -j4
$ make install
$ sudo apt-get install libc6-dbg
Bearbeiten Sie dann ~ / pyston / src / Makefile.local
VALGRIND := VALGRIND_LIB=$(HOME)/pyston_deps/valgrind-3.9.0-install/lib/valgrind $(HOME)/pyston_deps/valgrind-3.9.0-install/bin/valgrind
$ cd ~/pyston/src
$ make check -j4
Es laufen verschiedene Tests. Wenn der Test erfolgreich bestanden wurde, haben Sie eine Binärdatei. Danke für deine harte Arbeit.
$ ls ~/pyston/src/pyston*
/home/vagrant/pyston/src/pyston
/home/vagrant/pyston/src/pyston_prof
/home/vagrant/pyston/src/pyston_dbg
$ ./pyston
1.9ms to load stdlib
4.3ms for initCodegen
4.5ms for jit startup
Pyston v0.1, rev 1fe94923ff6f
>>
Der Vervose-Modus ist in Pyston 0.1 Standard. Wenn Sie also nicht an der Erstellung von LLVM interessiert sind, fügen Sie die Option "q (leise)" hinzu.
$ ./pyston -q
>>
Lesen Sie die Datei mit der Option "i" in REPL ein. Übrigens kann es nur gelesen werden, wenn sich die Datei in ~ / pyston / src befindet (sie fällt aufgrund eines Segmentierungsfehlers).
$ ./pyston -iq hello.py
Hello Pyston v0.1
Pyston v0.1, rev 1fe94923ff6f
>>
print("Hello Pyston v0.1")
Es kann auch aus einer Datei ausgeführt werden.
$ ./pyston -q hello.py
Hello Pyston v0.1
Weitere Details finden Sie hier.
https://github.com/dropbox/pyston/blob/master/README.md#command-line-options
Wenn Sie bisher nicht enttäuscht wurden, lesen Sie weiter.
Also habe ich eine Leistungsprüfung durchgeführt. Der Vergleich ist wie folgt
import time
def fib(n):
if n < 2: return n
return fib(n - 2) + fib(n - 1)
if __name__ == "__main__":
for x in range(3):
fib(3)
start = time.time()
result = fib(38)
timespan = time.time() - start
print(result)
print (timespan)
Python v2.7.3
$ python -i fib.py
39088169
11.7266070843
PyPy v2.2.1
$ ~/pypy-2.2.1-linux64/bin/pypy -i fib.py
39088169
2.00477910042
Pyston v0.1
$ cd ~/pyston/src
$ ./pyston -iq fib.py
39088169
1.37748503685
Mit dieser Art von Gefühl stellte ich fest, dass für rekursiven Code eine Beschleunigung zu erwarten ist.
import time
def fib(n):
value = 0
f1, f2 = 1, -1
for i in range(n+1):
value = f1 + f2
f2 = f1
f1 =value
return value
if __name__ == "__main__":
for x in range(3):
fib(3)
start = time.time()
result = 0
for x in range(0,5000):
result = fib(38)
timespan = time.time() - start
print(result)
print (timespan)
Python v2.7.3
$ python -i fib_loop.py
39088169
0.0174479484558
PyPy v2.2.1
$ ~/pypy-2.2.1-linux64/bin/pypy -i fib_loop.py
39088169
0.0166938304901
Pyston v0.1
$ cd ~/pyston/src
$ ./pyston -iq fib.py
39088169
0.0527310371399
Loops sind langsamer als Python.
↑ Ich habe auf den Bestätigungscode verwiesen.
das ist alles.
Recommended Posts