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

Do you need help?

Come ottimizzare le performance di HW2?

m
matt_dev (290 points)
1 3 4
in HW2 obbligatorio by (290 points)
recategorized by
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 :)
405 views
closed

5 Answers

Best answer
SimoneBd96 (3030 points)
6 12 33
by (3.0k points)
selected by
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
by (1.8k 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
by (8.0k 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)
2 6 10
by (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)
12 32 56
by (12.3k 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
by (13.7k points)
pensa se il tuo programma fa iterazioni e/o controlli inutili!!
SimoneModiga (3370 points)
7 18 34
by (3.4k 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.