Dopo aver parlato di Cython, vediamo un altro caso interessante: la libreria Numba che, secondo quanto dichiarato:

Numba: A High Performance Python Compiler
Numba makes Python code fast
Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code

Premessa: da analisi come il benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP è chiaro che il linguaggio C consente di ottenere un'efficienza notevolmente maggiore rispetto a linguaggi iterpretati come Python. Tuttavia, con alcuni accorgimenti, anche Python può ottenere dei miglioramenti.

Per uniformarsi al solito caso di studio e poter quindi fare un confronto (risoluzione numerica dell'integrale definito di una funzione gaussiana, con le stesse iterazioni N=106, tradotto nei vari linguaggi), vediamo due casi distinti, con il codice ottimizzato nel miglior modo (poi facciamo una precisazione a riguardo):

  • codice Python "pulito"
  • codice Python con la libreria Numba

Vediamo il codice nello specifico:

  • caso 1: codice Python "pulito"
    import time
    def f():
        N=10**6
        ris=0
        a=0
        b=20
        h=(b-a)/N
        for i in range(N):
            ris+=2.718281828459045**(-0.5*(a+i*h)**2)
        ris*=h*1/(2*3.141592653589793)**0.5
        return ris
    start=time.time()
    f()
    end=time.time()
    print(end-start,"s")
  • caso 2: codice Python con la libreria Numba
    import time
    from numba import jit
    @jit(nopython=True)
    def f():
        N=10**6
        ris=0
        a=0
        b=20
        h=(b-a)/N
        for i in range(N):
            ris+=2.718281828459045**(-0.5*(a+i*h)**2)
        ris*=h*1/(2*3.141592653589793)**0.5
        return ris
    start=time.time()
    f()
    end=time.time()
    print(end-start,"s")

Risultati:

  • codice Python "pulito": tempo esecuzione in media 0,25 secondi
  • codice Python con la libreria Numba: tempo esecuzione in media 0,38 secondi

Quindi la libreria Numba, almeno per questo caso, NON ha migliorato le performance! Probabilmente casi diversi o modalità diverse (es. nel caso di Cython, compilando il codice).

La precedente precisazione da fare è che il codice è stato scritto facendo uso di una funzione f() che poi viene richiamata e non direttamente senza funzione, questo per uniformità fra i due casi (altrimenti avrebbe poco senso il confronto), dato che Numba richiede che l'algoritmo sia scritto dentro una funzione.

Powered by: FreeFlarum.
(remove this footer)