Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Velocizzazione di un programma

M
M.G (420 points)
5 7 12
in Es1 by (420 points)
Buonasera a tutti,

volevo chiedere quale fosse il metodo migliore per velocizzare un programma. Bisognerebbe scomporre il programma in più funzioni, separando in maniera tale i singoli compiti, oppure si può anche lasciare una singola funzione per poi migliorarla?
855 views
closed

7 Answers

Best answer
LeonardoEmili (35740 points)
13 65 155
by (35.7k points)
selected by

Buonasera!

Ad esser sinceri dividendo il programma in più funzioni non ne aumenti la velocità. Se da un lato è sicuramente vero che ne aumenti la leggibilità e la correzione dello stesso. Quindi questo te lo consiglio assolutamente anche perché se leggi in alcuni thread precedenti si parlava proprio di correzione di errori, ecco prova ad immaginare di cercare un errore in un codice di migliaia di righe con nomi di variabili strani che non ricordi e una struttura di if e elif annidati.. a dir poco impossibile! Quindi il consiglio è sempre quello di dividerlo in blocchetti più piccoli per facilitarne la manutenzione.

In secondo luogo per migliorare la velocità del programma, beh ad esser sinceri dipende dal numero e dal tipo di operazioni che richiedi al programma di far fare. Per esempio nel primo esercizio ci sono diversi modi per affrontare il problema, tra i metodi validi ce ne sono alcuni che possono richiedere tempi di esecuzione di minuti fino anche a ore, altri invece che sfruttando un'ampia conoscenza del problema da parte di chi redige il codice permettono di risparmiare tempo e diminuire il lavoro all'elaboratore! Quindi il mio consiglio in questo caso è di studiare a fondo il problema e di, se possibile, studiare i metodi e segreti più opportuni per velocizzare il processo di calcolo. Perché effettivamente si riduce tutto a questo, alla capacità di calcolo del tuo pc, dunque meno calcoli -> più veloce sarà il tempo di esecuzione ;)

Spero di aver assolto completamente i tuoi dubbi,

per qualsiasi altro dubbio rimango a disposizione.

.

Ti auguro una buona serata

Leonardo Emili

Jury Francia (7520 points)
23 76 100
by (7.5k points)
La migliore cosa sarebbe dividere il programma in più funzioni che si occupano dei vari compiti, e ovviamente anche le istruzioni all'interno di ogni funzione devono essere ottimizzate al massimo
francesco.dev (33560 points)
21 51 129
by (33.6k points)

Ciao!
Conviene sempre scomporre in funzioni, sia per una maggiore leggibilità, sia per un valore di complessità del codice minore ed anche per ottimizzare il tutto!
Cosicché scomporrai una soluzione in una serie di sotto problemi (molto efficiente).

Infine ti consiglio di considerare diversi approcci al problema, poiché non vi è un'unica soluzione per risolverlo e tra una soluzione e l'altra cambia di molto la velocità di esecuzione!

Sperando di esserti stato utile,
- Francesco Pio Scognamiglio

g
g.nosci (770 points)
5 11 17
by (770 points)
fondamentalmente devi cercare di ridurre al minimo i cicli (o comunque di uscire da un ciclo nella maniera più efficente possibile ) e di evitare controlli inutili
o
orlandoalessio1998 (7730 points)
7 24 36
by (7.7k points)
edited by
BUONASERA,

Partendo dal presupposto che non ho studiato specificatamente questa materia ma che ho solo qualche nozione di base posso dirti che, l'ottimizzazione di un programma per quando riguarda l'efficienza, viene effettuata partendo da uno studio ASINTOTICO  dell'algoritmo.
Parlando solo in generale, senza quindi girarci troppo intorno posso dirti che per vedere se il tuo programma è ben ottimizzato devi vedere:

- Quanti cicli utilizzi (ogni utilizzo di un ciclo aggiunge "n" di complessità asintotica dove n è il numero di cicli MASSIMI che il programma effettua nel peggiore dei casi)  es. For di i in range (sqrt di n)-> n è sqrt di n
   da questo segue che se hai due cicli annidati avrai "n*m" mentre con cicli non annidati dovresti avere n+m come complessità (non sono sicurissimo di quest'ultima).
- Quante condizioni usi (ogni condizione è a "pesantezza" COSTANTE quindi è abbastanza facile da calcolare)

Detto questo l'unico consiglio che posso darti è quello di verificare quante volte (nel peggiore dei casi) viene ciclato il tuo programma e da quante codizioni usi, in linea generale se ottimizzi questi due valori dovresti riuscire a ridurre i tempi di esecuzione e anche lo spazio di memoria utilizzato.
eduardo_rinaldi (2780 points)
8 16 25
by (2.8k points)

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 :)

AnFrost (8270 points)
10 15 25
by (8.3k points)
Per velocizzare un programma ti consiglio di scomporlo prima di tutto in diverse funzioni, ma soprattutto è molto importante limitare al minimo l'utilizzo di cicli e controlli, in questo modo oltre a ridurre il tempo di esecuzione avrai anche una minore complessità ciclomatica. Se ritieni che un ciclo o una condizione siano necessari prova comunque a vedere se possono essere sostituiti dai metodi della libreria di Python.