Numba (Softwarepaket)

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Numba

Basisdaten

Entwickler Travis E. Oliphant
Erscheinungsjahr 2012
Aktuelle Version 0.60.0
(13. Juni 2024)
Betriebssystem Windows, macOS, Linux
Programmier­sprache Python, C
Kategorie Just-in-time-Compiler
Lizenz BSD 2-Clause Simplified
https://github.com/numba/numba

Das Softwarepaket numba ist ein Just-in-time-Compiler für Python, der numerische Funktionen in Maschinencode übersetzt, was die Ausführung dieser Funktionen beschleunigt. Ebenso ermöglicht es die parallele Verarbeitung von NumPy-Objekten auf mehreren Kernen des Prozessors wie auch der Grafikkarte.

numba baut auf LLVM und dem Python-Paket llvmlite auf.

Das numba-Projekt wurde durch Travis Oliphant, Mitgründer von Anaconda Inc., angestoßen. Anaconda gibt die gleichnamige Python-Distribution heraus; von der Anaconda Inc. wird numba hauptsächlich entwickelt. DARPA, Intel, nvidia und AMD fördern das Projekt.

Dieses Programm zeigt alle Primzahlen zwischen 1 und 500.000 an. Die einzige Veränderung gegenüber normalem Python-Code sind die Zeilen für den Import des numba-Pakets, und der Dekorator.

import numba
import math

# Sogenannter decorator; teilt mit, dass diese Funktion
# kompiliert werden soll - mit Angabe des Funktionsprototypen (die Funktion ist
# vom Typ boolean und erhält als Aufrufparameter einen uint32).
@numba.jit(numba.boolean(numba.uint32))
def isprime(n):
    if n < 2:
        return False    # 0 und 1 sind keine Primzahlen.
    if n == 2:
        return True     # 2 ist prim
    if (n % 2) == 0:
        return False    # Modulo 2 wird gesondert behandelt.

    # Es genuegt, Teiler bis Wurzel(n) zu testen.
    divMax = math.floor(math.sqrt(n))

    # Nur ungerade Zahlen als Teiler testen.
    for divisor in range(3, divMax, 2):
        if (n % divisor) == 0:
            # Ein Teiler wurde gefunden, n kann keine Primzahl sein --> Abbruch
            return False
    return True     # Kein Teiler gefunden, n ist prim.

for i in range(1, 500000):
    if isprime(i):
        pass # nur 'pass', da ein 'print' keine Vergleichbarkeit mehr erlaubt

Die Laufzeit dieses Programms ist mit einer in C++ programmierten Variante vergleichbar.