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?
PPS: Ho eseguito lo stesso test anche con un dizionario di 1 elemento, il try vince comunque