führe ich einen einfachen Test für eine Testfunktion in Python durch. Danach fasse ich meine Verbesserungen der Laufzeitleistung durch die Anwendung von Numba auf mein agentenbasiertes Modellierungs-Framework in Python zusammen.
Numba in Python installieren
Numba kann mit dem Befehl pip install installiert werden. Geben Sie einfach Folgendes in Ihr Terminal ein:
pip install numba
Für Listen empfehle ich, dass Sie numpy (dh numpy- Arrays) verwenden, da Sie dadurch die Standard – Python-Liste vermeiden können . Wenn es noch nicht installiert ist, können Sie numy auf die gleiche Weise installieren:
pip install numpy
Sie können jetzt numpy und numba importieren und numba verwenden, um Ihren Code schneller auszuführen. Dazu können Sie den @njit- Dekorator verwenden.
Testen der Leistungsverbesserung von Numba in Python
Zeit, sich einen einfachen Laufzeitverbesserungstest in Python anzusehen. Der folgende Code implementiert Numba, um ein schnelleres Python-Programm zu haben.
import numpy as np
from numba import jit
import random
import time
def rand_events(n: int) -> np.ndarray:
ls = np.zeros(n)
for i in range(n):
x = random.random()
while True:
y = random.random()
if x < y:
ls[i] = y
break
return ls
""" RUNTIME TEST WITHOUT NUMBA -------------------------- """
_start_time = time.time()
vals = rand_events(10000000)
_end_time = time.time()
print(str(_end_time - _start_time))
""" RUNTIME TEST WITH NUMBA ------------------------------ """
_start_time = time.time()
jit_rand_events = jit(nopython=True)(rand_events)
vals = jit_rand_events(10000000)
_end_time = time.time()
print(str(_end_time-_start_time))
_start_time = time.time()
vals = jit_rand_events(10000000)
_end_time = time.time()
print(str(_end_time-_start_time))
Im obigen Code entspricht der Aufruf von jit(nopython=True) der Verwendung des @njit- Deklarators. Wenn der obige Code ausgeführt wird, sieht die Ausgabe im Terminal in etwa so aus (abhängig vom Ergebnis der Computer- und Zufallszahlengenerierung)
9,1829195022583 1,2913379669189453 0,8751001358032227
Das bedeutet, dass es 9,18 Sekunden dauerte, um die Funktion rand_events() mit n = 10.000.000 aufzurufen. Nach dem Anwenden des @njit- Deklarators und dem erneuten Ausführen der Funktion dauert es nur 1,29 Sekunden (einschließlich „Jitten“ der Funktion). Ohne den Aufruf des @njit- Deklarators würde es 0,87 Sekunden dauern, um die „Jitted“-Version von rand_events() aufzurufen. Das ist eine deutliche Verbesserung der Laufzeit.
Anwenden von Numba für schnellere Python-Simulationen
Numba kann Simulationsframeworks schneller machen. Aber nur, wenn große Teile des Frameworks numerisch orientiert sind. Außerdem sollte das Framework numpy integrieren , da numba numpy sehr gut versteht. In einem stark objektorientierten Framework kann dies eine Herausforderung sein. Aber wenn es Ihnen gelingt, rechenintensive Teile des Codes in numerischen Code umzuwandeln, dann kann numba zu erheblichen Laufzeitverbesserungen von Python-Code führen.
Wirtschaftsingenieur mit Interesse an Optimierung, Simulation und mathematischer Modellierung in R, SQL, VBA und Python
Leave a Reply