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.

dizionari nell'hw2

Luca_12_3 (580 points)
4 4 9
in HW2 obbligatorio by (580 points)
quando uso i dizionari mi da un errore di key, io l'ho risolto con l'uso del .get()

la mia domanda è: è più veloce usare il .get() o una funzione con :"try: except:"?
905 views

2 Answers

E
Edward (25950 points)
4 4 172
by (26.0k points)
edited by

Ciao,

per rispondere alla tua domanda, è più veloce usare .get().
Se vuoi testarlo anche tu, puoi farlo nella console iPython di spyder, crei prima una funzione che usa get, e poi una che usa try ed except. Ed usi il comando %timeit funzione() per vedere quanto tempo ci mettono.

Ti consiglio però di ricontrollare bene il tuo algoritmo, sarebbe preferibile evitare di andare a cercare nel dizionario una chiave che non esiste, e per la risoluzione non è necessario.

Inoltre, se proprio devi, un if è più veloce sia del metodo get che di try ed except.

EDIT:
Se la chiave non è presente, if è più veloce di get, che è più veloce di try/except
Se la chiave è presente, try è il più veloce di entrambi, if e get sono equivalenti

Luca_12_3 (580 points)
4 4 9
by (580 points)
se facessi  es: "if dizionario[key].....:" con una key che non esiste nel dizionario non mi darebbe comunque KeyError?
E
Edward (25950 points)
4 4 172
by (26.0k points)
Dovresti fare if key in dizionario
fc-dev (16450 points)
16 20 34
by (16.5k points)

Inoltre, se proprio devi, un if è più veloce sia del metodo get che di try ed except.

Meh. In realtà no.
Documentazione di Python, glossario, voce EAFP (https://docs.python.org/3.7/glossary.html#term-eafp)

E
Edward (25950 points)
4 4 172
by (26.0k points)
edited by
A me testandolo con timeit risulta più veloce If

Poi il tuo link parla semplicemente di coding style, non di velocità.

Testalo e vedrai che in termini di velocità if > get > try/except
fc-dev (16450 points)
16 20 34
by (16.5k points)
edited by

Se fai if chiave in dizionario stai di fatto dicendo a python di scorrere le chiavi del dizionario con un for per controllare se la chiave è presente.
quando fai dizionario[chiave] anche stai dicendo a python di scorrere le chiavi del dizionario per trovare quella stessa chiave ed estrarne il valore.


Ne deriva che è ovviamente più pesante fare due cicli che farne uno solo, no?
Chiaramente l'avere un eccezione ti fa perdere tempo, ma quel tempo è irrisorio, e più è grande il dizionario più diventa irrisorio se comparato al tempo necessario a cercare la chiave due volte.

Se fai un timeit con un dizionario con 2 elementi magari ti esce che l'if è più veloce.
Ma più aumentano gli elementi, e più il doppio ciclo sarà lungo rispetto a farne uno solo e lanciare un eccezione.


Esempio: dizionario da 100.000 elementi, cerco l'elemento al centro del dizionario (quindi un elemento non troppo all'inizio dato che svantaggerebbe il try, e un elemento non troppo alla fine dato che svantaggerebbe l'if)
(si, concettualmente parlando non esiste il centro di un dizionario dato che non è ordinato, ma a livello pratico le chiavi sono sempre dati, e sono ordinate per ordine di inserimento)
Come puoi notare l'if perde colpi rispetto al try

PS: Esegui questo stesso test con soli 10 elementi e vedrai che il try è comunque più veloce, ancora convinto che l'if vinca? devil
PPS: Ho eseguito lo stesso test anche con un dizionario di 1 elemento, il try vince comunque

E
Edward (25950 points)
4 4 172
by (26.0k points)
edited by
Avevo erroneamente considerato solamente il caso in cui la chiave non è presente, in quel caso l'if è più veloce (try/except in questo caso risulta molto più lento).

Nel caso in cui la chiave è presente, hai ragione, try è leggermente più veloce, mentre if e get sono equivalenti.

Ho editato il post inserendo le correzioni
fc-dev (16450 points)
16 20 34
by (16.5k points)

Errore anche mio allora.

In effetti non avevo controllato il caso in cui c'era l'eccezione, e in quel caso arriva ad essere anche diverse volte più lento di un if 
Quindi in linea di massima il try conviene se sai che è poco probabile che ci siano problemi, mentre l'if conviene se sai che è molto probabile che ci siano problemi.

a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Nel mio caso try e if sono equivalenti
d
dani3390 (1490 points)
2 2 10
by (1.5k points)

Il get ha un Time Complexity O(1), ovvero ha un valore costante.
Ciò significa che più è grande il tuo dizionario, maggiore sarà il tempo che ci metterà a trovare il valore.
Reference https://wiki.python.org/moin/TimeComplexity
Per quanto riguarda l'uso di una funziona con il try&except, dipende tutto dalla funzione, in quanto potresti tranquillamente creare una funzione con un Time Complexity maggiore e darti la zappa sui piedi.
Prova a "spiegare" quello che vorresti fare nella funzione, a quel punto ti si potrà dare una risposta concreta

andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
grazie del link, l'ho linkato in home