Tempo usato da test_01.py

fc-dev (16450 points)
12 20 34
asked Oct 25, 2019 in HW2 obbligatorio by fc-dev (16,450 points)
retagged Oct 25, 2019 by fc-dev
Ho notato dal profiler che più di 400ms (a volte anche 440) nel test 5 dell'HW 2 sono sprecati alla riga 77 di test_01.py, ovvero quella che si occupa di creare la lista da 1,124,250 elementi...

È normale come cosa che anche quelli vengano considerati nei 1500ms di tempo che abbiamo per eseguire l'esercizio?

A rigor di logica il tempo per eseguire l'esercizio dovrebbe essere solo quello che ci mettiamo per trasformare l'input nell'output (e non anche quello necessario alla libreria di test per creare l'input), no?

4 Answers

Best answer
andrea.sterbini (172780 points)
514 935 1789
answered Oct 25, 2019 by andrea.sterbini (172,780 points)
selected Oct 27, 2019 by fc-dev

Tecnicamente, si usa pytest-timeout per temporizzare facilmente l'esecuzione dei metodi con nome test_XXXXX.
Per comodità creiamo un metodo unico do_test per eseguire i test e nei test_XXX leggiamo gli input da file o generiamo gli input.
Per me non è un problema spostare la generazione/lettura dei dati nel metodo setUp della classe, che non viene temporizzato, oppure inserire il timeout direttamente dentro il metodo do_test.
Tenuto conto che inserire il timeout dentro do_test mi permette anche di risolvere altri problemi, sicuramente dal prossimo HW opzionale userò la nuova temporizzazione.
Non sono però sicuro di voler aggiornare (e ricalcolare ed eventualmente abbassare) il timeout di questo HW, che ho fissato sperimentalmente.
Farò qualche prova ma non vi prometto niente.

(stay mail)

E
Edward (25950 points)
2 4 172
commented Oct 25, 2019 by Edward (25,950 points)
La nuova temporizzazione sicuramente sarà migliore. Il mio programma ora come ora supera il test 5 in base a quanto tempo ci mette a generare la lista di input (ora per esempio funziona perchè ci ha messo meno tempo del solito)
fc-dev (16450 points)
12 20 34
commented Oct 25, 2019 by fc-dev (16,450 points)
La ringrazio per aver considerato questa possiblità
Tom Grobusch (13960 points)
2 2 10
commented Oct 25, 2019 by Tom Grobusch (13,960 points)
Il problema più grande mi sembra che il salto da 28 a 30 punti è grandissimo, ma invece per arrivare da 30 a 34 punti veramente non ci vuole tanto. Infatti si vede che quelli che sono riusciti a superare tutti i test hanno entrambi i bonus e almeno uno.
Tom Grobusch (13960 points)
2 2 10
answered Oct 25, 2019 by Tom Grobusch (13,960 points)
Avrei pensato di sì, anche perché per alcuni esempi le liste sono generate prima e solo pochi vengono generati ogni volta di nuovo. Adesso non so quanto sia veloce il tuo computer rispetto alla VM, ma 400ms è più di 1/4 del timeout, quindi per alcuni esercizi il programma ha praticamente meno tempo, per altri veramente 1,5 secondi.

Quindi non lo so, mi sembra strano, però da una parte capisco che non volevano mettere tutte queste istruzioni nel json file...
fc-dev (16450 points)
12 20 34
commented Oct 25, 2019 by fc-dev (16,450 points)
Con 440ms mi riferivo alla VM, non al mio computer
Christian (15220 points)
2 4 77
answered Oct 25, 2019 by Christian (15,220 points)
Anche @Edward aveva posto lo stesso quesito sul thread relativo all'HW2. Per ora considerando di quanto sforo il timeout per me è indifferente.. :D
andrea.sterbini (172780 points)
514 935 1789
answered Oct 25, 2019 by andrea.sterbini (172,780 points)
Controllo se pytest-timeout calcola quella parte di tempo nel timeout oppure no.
E
Edward (25950 points)
2 4 172
commented Oct 25, 2019 by Edward (25,950 points)

Io sono arrivato a questa conclusione notando che fornendogli la lista già pronta, ci metteva circa 0.9s

Invece durante il test ci metteva 1.3s, e 0.3s circa venivano usati da test_01.py alla riga 77 (ossia la list comprehension per generare l'input)

fc-dev (16450 points)
12 20 34
commented Oct 25, 2019 by fc-dev (16,450 points)

Anchio ho fatto gli stessi test e anch'io ho avuto gli stessi risultati, per questo ho posto la domanda.

Solo che finché sulla macchina locale ti si mangia 270ms tutto ok, ma sulla macchina virtuale si arriva a questi livelli...

andrea.sterbini (172780 points)
514 935 1789
commented Oct 25, 2019 by andrea.sterbini (172,780 points)
Comunque noi testiamo il timeout sulla VM.
Compreso di tutti i tempi accessori.
fc-dev (16450 points)
12 20 34
commented Oct 25, 2019 by fc-dev (16,450 points)
edited Oct 25, 2019 by fc-dev
@andrea.sterbini capisco il "compreso di tutti i tempi accessori", però... non mi sembra molto sensato il fatto che il tempo di generazione dell'input di per se impiega da solo il 30% del tempo a disposizione (440/1500 ~=0,29)
E
Edward (25950 points)
2 4 172
commented Oct 25, 2019 by Edward (25,950 points)
Più che altro in questo modo si hanno timeout diversi per ogni test. A questo punto però immagino che i professori vogliano che quel test venga superato in 1s, e non in 1.5s
fc-dev (16450 points)
12 20 34
commented Oct 25, 2019 by fc-dev (16,450 points)
Immagino di si... ma a quel punto non facevano prima a dire che il timeout era di 1 secondo?
andrea.sterbini (172780 points)
514 935 1789
commented Nov 2, 2019 by andrea.sterbini (172,780 points)
Facevamo prima se avessimo avuto la misura dei tempi sulla singola chiamata della funzione invece che con pytest-timeout.

Adesso ce l'abbiamo e d'ora in poi sarete tutti più felici