Dopo aver introdotto le espressioni lambda (lambda function), utili per poter definire funzioni anonime, semplici, in modo analogo a quanto avviene per le macro in C, ho voluto fare un test interessante, misurare le prestazioni, velocità di esecuzione del codice nei diversi casi:
- espressione lambda
- funzione tradizionale
- espressione diretta (quindi senza l'uso di funzioni)
Nel caso dell'espressione lambda, il codice è il seguente:
import time
x = lambda a : a + 1
N=10000000
start=time.time()
for i in range(N):
x(i)
end=time.time()
print(end-start,"s")
Nel caso della funzione tradizionale abbiamo:
import time
def f(a):
a+1
N=10000000
start=time.time()
for i in range(N):
temp=f(i)
end=time.time()
print(end-start,"s")
Nel caso dell'espressione diretta (senza funzioni) abbiamo:
import time
N=10000000
start=time.time()
for i in range(N):
temp=i+1
end=time.time()
print(end-start,"s")
L'esempio è semplicissimo e calcola N volte x+1, con N=10000000. Vediamo quindi il diverso tempo di esecuzione del codice.
Risultati: benckmark prestazioni lambda function vs funzione tradizionale vs espressione diretta
- espressione lambda: tempo di esecuzione medio 0,654 secondi; deviazione standard 0,054s, coefficiente di variazione (ovvero std.dev/media) 0,083
- funzione tradizionale: tempo di esecuzione medio 0,705 secondi; deviazione standard 0,0433s, coefficiente di variazione 0,061
- espressione diretta: tempo di esecuzione medio 0,616 secondi; deviazione standard 0,05s, coefficiente di variazione 0,081
Commentando i risultati, come già evidente da altri test (vale anche per altri linguaggi, non solo Python, vedi ad esempio Benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP), scrivere l'espressione diretta permette di ottenere le massime performance in termini di velocità di esecuzione (chiaro che il codice può diventare "meno leggibile" e anche ripetitivo, quindi è sempre da valutare caso per caso, quali siano le priorità del progetto). Una lambda function può risultare un po' più efficiente rispetto ad una funzione tradizionale; dal tempo di esecuzione del codice, per il caso di studio, infatti la lambda function è risultata il 6% più lenta rispetto ad alla relatiiva espressione diretta, mentre una funzione tradizionale è risultata il 14% più lenta rispetto all'espressione diretta.
Ricordiamo infine che, vista la nota inefficienza del linguaggio Python, almeno per gli aspetti "critici" di un grande progetto scritto in Python (che quindi non possiamo - o non conviene - tradurre completamente in altro linguaggio) si può pensare ad un funzionamento parallelo con C, almeno per le criticità come detto (cicli "pesanti" dal piunto di vista computazionale), si rimanda alla discussione: Eseguire codice C in Python tramite CFFI