Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Misurazione delle Prestazioni delle Funzioni | Comprendere e Misurare le Prestazioni
Tecniche di Ottimizzazione in Python

bookMisurazione delle Prestazioni delle Funzioni

Sebbene la misurazione di snippet di codice basati su stringhe possa essere sufficiente in alcune situazioni, questo approccio manca di flessibilità. Utilizzare timeit con le funzioni offre un modo più efficace per misurare le prestazioni, e i decoratori semplificano il processo di misurazione delle prestazioni di più funzioni in modo pulito e modulare.

Utilizzo di timeit con le funzioni

timeit può misurare direttamente le prestazioni delle funzioni passando un callable (cioè una funzione) invece di una stringa. Questo metodo è più flessibile e leggibile rispetto all'uso delle stringhe, soprattutto quando si desidera eseguire benchmark su funzioni complesse.

1234567891011121314
import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
copy

Passaggio di generate_squares come funzione (callable) da cronometrare utilizzando timeit.timeit(). Analogamente a prima, il parametro number specifica il numero di esecuzioni della funzione (15 volte). Il tempo medio di esecuzione viene quindi calcolato dividendo il tempo totale per il numero di esecuzioni.

Questo metodo è più pulito e più efficiente per il benchmarking di funzioni reali, ed evita il sovraccarico dovuto alla valutazione di codice da una stringa.

123456789
import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
copy

Si è verificato il seguente errore: NameError: name 'np' is not defined. L'errore si verifica perché timeit.timeit() esegue il codice in isolamento, quindi non ha accesso a numpy a meno che non venga importato esplicitamente nell'argomento setup:

# Import numpy in timeit's environment
setup = 'import numpy as np'  
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)

L'utilizzo delle funzioni è più pulito, riduce gli errori e non richiede la gestione di importazioni esterne tramite una stringa setup.

Miglioramento della Misurazione delle Prestazioni con i Decoratori

Applicare la stessa logica di misurazione del tempo a più funzioni è una pratica comune, e un decoratore offre un modo pulito ed efficiente per implementarla senza ripetere il codice.

Ogni volta che una funzione viene chiamata, viene eseguita normalmente, ma con benchmarking integrato. I decoratori offrono diversi vantaggi: aumentano la riusabilità applicando la stessa logica a più funzioni, migliorano la chiarezza separando la logica di misurazione dal nucleo funzionale e consentono la personalizzazione, come la regolazione del numero di iterazioni o l'aggiunta di metriche aggiuntive per l'analisi delle prestazioni.

123456789101112131415161718192021
import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
copy

Ora, ogni volta che si chiama una funzione decorata con @timeit_decorator, le sue prestazioni verranno misurate automaticamente e i risultati verranno visualizzati.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 7.69

bookMisurazione delle Prestazioni delle Funzioni

Scorri per mostrare il menu

Sebbene la misurazione di snippet di codice basati su stringhe possa essere sufficiente in alcune situazioni, questo approccio manca di flessibilità. Utilizzare timeit con le funzioni offre un modo più efficace per misurare le prestazioni, e i decoratori semplificano il processo di misurazione delle prestazioni di più funzioni in modo pulito e modulare.

Utilizzo di timeit con le funzioni

timeit può misurare direttamente le prestazioni delle funzioni passando un callable (cioè una funzione) invece di una stringa. Questo metodo è più flessibile e leggibile rispetto all'uso delle stringhe, soprattutto quando si desidera eseguire benchmark su funzioni complesse.

1234567891011121314
import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
copy

Passaggio di generate_squares come funzione (callable) da cronometrare utilizzando timeit.timeit(). Analogamente a prima, il parametro number specifica il numero di esecuzioni della funzione (15 volte). Il tempo medio di esecuzione viene quindi calcolato dividendo il tempo totale per il numero di esecuzioni.

Questo metodo è più pulito e più efficiente per il benchmarking di funzioni reali, ed evita il sovraccarico dovuto alla valutazione di codice da una stringa.

123456789
import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
copy

Si è verificato il seguente errore: NameError: name 'np' is not defined. L'errore si verifica perché timeit.timeit() esegue il codice in isolamento, quindi non ha accesso a numpy a meno che non venga importato esplicitamente nell'argomento setup:

# Import numpy in timeit's environment
setup = 'import numpy as np'  
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)

L'utilizzo delle funzioni è più pulito, riduce gli errori e non richiede la gestione di importazioni esterne tramite una stringa setup.

Miglioramento della Misurazione delle Prestazioni con i Decoratori

Applicare la stessa logica di misurazione del tempo a più funzioni è una pratica comune, e un decoratore offre un modo pulito ed efficiente per implementarla senza ripetere il codice.

Ogni volta che una funzione viene chiamata, viene eseguita normalmente, ma con benchmarking integrato. I decoratori offrono diversi vantaggi: aumentano la riusabilità applicando la stessa logica a più funzioni, migliorano la chiarezza separando la logica di misurazione dal nucleo funzionale e consentono la personalizzazione, come la regolazione del numero di iterazioni o l'aggiunta di metriche aggiuntive per l'analisi delle prestazioni.

123456789101112131415161718192021
import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
copy

Ora, ogni volta che si chiama una funzione decorata con @timeit_decorator, le sue prestazioni verranno misurate automaticamente e i risultati verranno visualizzati.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 3
some-alt