Schnellere Simulationen mit Numba

 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.

You May Also Like

Leave a Reply

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.