Ciao, ovviamente per velocizzare il programma ci sono diversi approcci che variano in base a quello che devi fare.
Come detto da qualcuno prima e dal prof Monti, scomporre in più funzioni il programma non velocizza l'esecuzione, ma bensì fa l'esatto opposto, però ne diminuisce l'intricatezza.
Puoi adottare dei piccoli accorgimenti nelle tue funzioni, che ti faranno guadagnare microsecondi, che per ogni loop possono diventare millisecondi risparmiati.
Un accorgimento che adotto io, anche se è "unpythonic", è sostituire le list comprehension con le funzioni dell'itertool map() e filter(), che ti consentono di ottenere lo stesso risultato ma in modo molto più veloce.
Se poi stai a guardare anche i guadagni su nanosecondi ci sono altre soluzioni come sostituire gli if con i try except (con google trovi facilmente come fare), lavorare con i thread (questo può ridurre di molto i tempi), etc.. ma mi sembrano soluzioni un po' troppo inutili e sprecate su programmini così semplici e non so nemmeno se vengono accettate dai professori;
Quello che però ovviamente ti consiglio maggiormente è riguardare la logica del programma, e trovare il modo per scartare nei cicli i casi inutili su cui operare migliaia di volte perdendo preziosi ms.
Spero ti sia stato utile :)