So, recently while testing some coding I questioned myself, what would be better performance wise, if trying to access a dictionary key directly with a try/except strategy or if I would make use of If key in access.

This question has to do with my lack of knowledge on the ìf behaviour in the below statement:

if key in dictionary:
    #do Something with dict and key here

My initial thought was, well it should behave similar to a search in an array, as this was what I thought it would translate to:

if key in dictionary.keys():
    #This would have returned an array, losing the O(1) properties of hashmaps for lookups

So, I thougt, well, then let’s try to access it and just catch an error if the key doesn’t exist, this is meant for a very high request rate and we should keep our lookups low:

try:
    dictionary[key]
except KeyError as e:
    pass

Well, and that was it.. I thought.. I was very wrong.

Eventually while iterating on the method, I got the question again. This time I tested it.

So how to test performance of both statements?

Well, let’s open a python shell and find out using the timeit module.

So first lets try the Try/Except block

import timeit

timeit.timeit(setup="a={k:k  for k in range(10000)}",stmt="try:\n   b=a[10001]\nexcept:\n pass")
0.3645319938659668

Ok, that is an expensive move. It could be the time for the dictionary to be created, taking a toll here.

Lets try an If statement

timeit.timeit(setup="a={k:k  for k in range(10000)}",stmt="if 10001 in a:\n b=a[10001]\nelse:\n pass")
0.048596858978271484

Ok, that’s much faster, so, I guess, no more try except blocks to find out key is present in the dictionary.

André Ilhicas dos Santos

Devops Padawan, curious about systems automation, learning new languages, paradigms tools each day.

ilhicas ilhicas


Published