Il line-profiler aggiunge il "decoratore" profile alle funzioni di base. (un decoratore modifica il funzionamento della funzione definita subito dopo).
In particolare @profile si mette subito prima delle funzioni che ci interessano per registrarne le performance.
Quindi il line-profiler funziona solo se mettete @profile subito prima della vostra funzione.
Però se lasciate @profile nel codice i normali test non funzionano.
Un trucco è iniziare il file program01.py con le righe
if 'profile' not in __builtins__:
print("installing dummy profile")
def profile(x): return x
In questo modo se NON state usando il line-profiler verrà definita una funzione profile che non fa nulla alla funzione che segue.
Potrete lasciare i decoratori @profile nel codice.