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

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Tempo usato da test_01.py

fc-dev (16450 points)
16 20 34
in HW2 obbligatorio by (16.5k points)
retagged by
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?
1.1k views
closed

4 Answers

Best answer
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
selected by

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)
3 4 172
by (26.0k 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)
16 20 34
by (16.5k points)
La ringrazio per aver considerato questa possiblità
Tom Grobusch (13960 points)
2 2 10
by (14.0k 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
by (14.0k 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)
16 20 34
by (16.5k points)
Con 440ms mi riferivo alla VM, non al mio computer
Christian (15220 points)
3 4 77
by (15.2k 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 (207920 points)
750 1267 2373
by (208k points)
Controllo se pytest-timeout calcola quella parte di tempo nel timeout oppure no.
E
Edward (25950 points)
3 4 172
by (26.0k 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)
16 20 34
by (16.5k 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 (207920 points)
750 1267 2373
by (208k points)
Comunque noi testiamo il timeout sulla VM.
Compreso di tutti i tempi accessori.
fc-dev (16450 points)
16 20 34
by (16.5k points)
edited by
@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)
3 4 172
by (26.0k 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)
16 20 34
by (16.5k points)
Immagino di si... ma a quel punto non facevano prima a dire che il timeout era di 1 secondo?
andrea.sterbini (207920 points)
750 1267 2373
by (208k 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