Come ottimizzare le performance di HW2?

m
matt_dev (290 points)
1 3 4
asked Oct 27, 2020 in HW2 obbligatorio by matt_dev (290 points)
recategorized Oct 30, 2020 by andrea.sterbini
Salve a tutti!
Ieri ho terminato di svolgere il primo homework obbligatorio.
Ho creato una prima versione funzionante, in grado di produrre l'output richiesto tenendo conto di tutti i criteri con cui si svolge una partita di Scarabeo+.

Purtroppo la mia soluzione fa un utilizzo massivo di iterazioni e condizioni varie, quindi quando ho lanciato i test sono andati tutti in timeout.

Quali sono le strategie più usate per ottimizzare i tempi di elaborazione?

Grazie in anticipo a tutti coloro che mi aiuteranno :)
251 views

5 Answers

Best answer
SimoneBd96 (3030 points)
5 11 33
answered Oct 27, 2020 by SimoneBd96 (3,030 points)
selected Oct 27, 2020 by matt_dev
Per l'ottimizzazione devi stare attento si ai cicli, ma anche alle funzioni che utilizzi poiché ci sono delle funzioni che "rubano" molto tempo, per questo ti consiglio di vederti i tempi di esecuzioni delle varie funzioni, puoi consultare la wiki di py:

https://wiki.python.org/moin/TimeComplexity

per quanto riguarda il lavoro vero e proprio di ottimizzazione ti consiglio di utilizzare il tool LineProfiler di spyder, che ti dice dove il tuo codice è più lento, digita :

conda install -c conda-forge spyder-line-profiler

all'interno di anaconda prompt, per l'utilizzo ti rimando a questa discussione:

https://q2a.di.uniroma1.it/16914

Buon lavoro.
C
ChristianSt (1790 points)
3 9 25
commented Oct 27, 2020 by ChristianSt (1,790 points)

Io aggiungerei in particolare l'utilizzo del comando:   pytest test_01.py --profile-svg

Genera una mappa svg molto comoda per visualizzare con maggiore dettaglio dei tempi e chiamate dei metodi 

Fabioerpini (7970 points)
6 10 27
commented Oct 27, 2020 by Fabioerpini (7,970 points)

Per chi ricevesse un errore  del tipo:

ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --profile-svg
  inifile: None

Bisogna prima lanciare il seguente comando:

pip install pytest-profiling
kevincukaj (660 points)
1 5 10
answered Oct 27, 2020 by kevincukaj (660 points)
Se proprio tutti i test ti vanno in timeout, cerca di vedere se il tuo codice non sia stato ottimizzato soltanto per l'esempio fornito. Se ci mette troppo persino per i primi, è molto probabile che il codice vada in loop. Ti dico cosi perché io ebbi lo stesso problema con il mio codice.
9
9Andrea9 (12340 points)
10 31 56
answered Oct 27, 2020 by 9Andrea9 (12,340 points)
Le soluzioni che ho utilizzato io sono:

-utilizzare più funzioni rispetto ai cicli

-l'uso del dizionario

-il passaggio dei valori nelle funzioni piuttosto che la creazione di questi direttamente in essa
giordano_sannino (13650 points)
7 16 81
answered Oct 27, 2020 by giordano_sannino (13,650 points)
pensa se il tuo programma fa iterazioni e/o controlli inutili!!
SimoneModiga (3370 points)
6 18 34
answered Oct 27, 2020 by SimoneModiga (3,370 points)
Ti consiglio di usare il parametro --profile di pytest, che ti dice esattamente quale parte del tuo codice è la piu' lenta, a me ha salvato.

Se hai parti del codice che ripetono le stesse operazioni al posto di scrivere quel pezzo di codice tante volte, lo scrivi una volta come funzione  e la richiami.