Misurazione 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.
1234567891011121314import 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')
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.
123456789import 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')
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.
123456789101112131415161718192021import 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()
Ora, ogni volta che si chiama una funzione decorata con @timeit_decorator, le sue prestazioni verranno misurate automaticamente e i risultati verranno visualizzati.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 7.69
Misurazione 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.
1234567891011121314import 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')
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.
123456789import 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')
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.
123456789101112131415161718192021import 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()
Ora, ogni volta che si chiama una funzione decorata con @timeit_decorator, le sue prestazioni verranno misurate automaticamente e i risultati verranno visualizzati.
Grazie per i tuoi commenti!