Dank der Selbstisolation haben wir Cythona in die Hände bekommen. Das Problem ist prosaisch - wie man in Python mit minimalem Syntaxverlust beschleunigt. Ein Ansatz ist die Verwendung von Cython (eine Mischung aus C und Python).
Die Veröffentlichung mit einem lauten Titel verfolgt . Aus dem Inhalt der Veröffentlichung kann jedoch wenig gelernt werden, da die Formeln und die resultierende Tabelle falsch sind. Versuchen wir, das von den Autoren des Beitrags gestartete Bild zu vervollständigen und das und zu markieren.
* Die Tests wurden mit Odroid xu4, Ubuntu Mate, Python 2.7.17 durchgeführt.
Cython ist einfach zu installieren (pip install cython).
Wir werden alle die gleichen Fibonacci-Zahlen quälen. Lassen Sie uns Dateien für Leistungssteigerungstests erstellen. Für die Python-Sprache (test.py):
def test(n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
print (a)
Für die Cython-Sprache (test2.pyx):
def test2(int n):
cdef int i
cdef double a=0.0, b=1.0
for i in range(n):
a, b = a + b, a
print (a)
Die Cython-Datei muss vorab erstellt werden. Erstellen wir dafür eine setup.py mit folgendem Inhalt:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('test2.pyx'))
Und sammle:
python setup.py build_ext --inplace
Nehmen wir nun die Datei aus dem genannten Beitrag mit Tests und korrigieren sie ein wenig, indem wir die Möglichkeit hinzufügen, zu Beginn Ihre eigene Nummer einzugeben (tests.py):
import test
import test2
import time
number = input('enter number: ')
start = time.time()
test.test(number)
end = time.time()
py_time = end - start
print("Python time = {}".format(py_time))
start = time.time()
test2.test(number)
end = time.time()
cy_time = end - start
print("Cython time = {}".format(cy_time))
print("Speedup = {}".format(py_time / cy_time))
Lass uns nachsehen, was passiert ist:
python tests.py
Ergebnisse:
Für Python 2.7:
enter number: 10
Python time = 1.62124633789e-05
Cython time = 4.05311584473e-06
Speedup = 4.0
enter number: 100
Python time = 3.40938568115e-05
Cython time = 5.00679016113e-06
Speedup = 6.80952380952
enter number: 1000
Python time = 0.000224113464355
Cython time = 1.19209289551e-05
Speedup = 18.8
enter number: 100000
Python time = 0.0200171470642
Cython time = 0.000855922698975
Speedup = 23.3866295265
Für Python 3:
enter number: 10
Python time = 7.653236389160156e-05
Cython time = 2.8133392333984375e-05
Speedup = 2.7203389830508473
enter number: 100
Python time = 8.678436279296875e-05
Cython time = 3.170967102050781e-05
Speedup = 2.736842105263158
enter number: 1000
Python time = 0.00031876564025878906
Cython time = 4.673004150390625e-05
Speedup = 6.821428571428571
enter number: 100000
Python time = 0.01643967628479004
Cython time = 0.0004260540008544922
Speedup = 38.5858981533296
* Das Modul test2.pyx wurde mit dem folgenden Befehl "neu erstellt":
python3 setup.py build_ext --inplace
** von
cython installiert : pip3 install cython
Sie können auf das Erstellen von test2.pyx mit setup.py verzichten. Dazu müssen Sie nur die Zeilen zur Datei tests.py hinzufügen ::
import pyximport
pyximport.install()
Jetzt wird test2.pyx jedes Mal im laufenden Betrieb erstellt, wenn tests.py ausgeführt wird, und es befinden sich weniger Dateien im Ordner.
So starten Sie Cython unter Windows.
Trotz der Tatsache, dass Cython das Zusammenstellen von Dateien für Python3 und Python2 ermöglicht, war
Mit python3 funktioniert der Befehl build:
python setup.py build_ext -i --compiler=msvc
Für die vollwertige Arbeit müssen Sie jedoch einen Teil der Visual Studio 2019-Komponenten installieren. Was genau installiert werden soll, ist in der Lösung hier angegeben .
Daher gibt es zwei Arbeitsoptionen, mit denen Sie in Fenstern mit Cython arbeiten (eine Datei erstellen) können.
Der erste verwendet Python2.7 und den Mingw-Compiler.
Das Verfahren ist wie folgt.
1.Installieren Sie Cython selbst unter Python2.7:
py -2 -m pip install cython
2. Installieren Sie den mingw-Compiler:
mingw
3. Nach der Installation des Compilers und dem Hinzufügen zu den PATH-Fenstern kann die .pyx-Datei mit dem folgenden Befehl kompiliert werden:
python setup.py build_ext -i --compiler=mingw32
Der zweite verwendet python3.x und den msvc-Compiler.
So führen Sie Cython in einem Jupyter-Notebook aus.
Manchmal ist es notwendig, die Arbeit des Codes visuell mit jupyter zu testen. Um den Code nicht jedes Mal in cmd zu kompilieren, können Sie cython direkt in den Jupyter-Zellen verwenden.
Importieren Sie dazu Cython, indem Sie in der Jupyter-Zelle Folgendes ausführen:
%load_ext cython
Und lassen Sie uns in der nächsten Zelle Code ausführen:
%%cython -a
import numpy as np
cdef int max(int a, int b):
return a if a > b else b
cdef int chebyshev(int x1, int y1, int x2, int y2):
return max(abs(x1 - x2), abs(y1 - y2))
def c_benchmark():
a = np.random.rand(1000, 2)
b = np.random.rand(1000, 2)
for x1, y1 in a:
for x2, y2 in b:
chebyshev(x1, x2, y1, y2)
Wenn alles erfolgreich ist, sieht die Ausgabe folgendermaßen aus:
