Un peu de benchmarking :
1. Compréhension de la liste recréer le dict
In [7]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
...: dic = {k: v for k, v in dic.items() if v is not None}
1000000 loops, best of 7: 375 ns per loop
2. Compréhension de la liste recréer le dict en utilisant dict()
In [8]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
...: dic = dict((k, v) for k, v in dic.items() if v is not None)
1000000 loops, best of 7: 681 ns per loop
3. Boucle et suppression de la clé si v est None
In [10]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
...: for k, v in dic.items():
...: if v is None:
...: del dic[k]
...:
10000000 loops, best of 7: 160 ns per loop
Ainsi, la boucle et l'effacement sont les plus rapides à 160ns, la compréhension de liste est deux fois plus lente à ~375ns et avec un appel à dict()
est deux fois moins lent, soit ~680ns.
Enrouler 3 dans une fonction ramène le temps à environ 275ns. De plus, pour moi, PyPy était environ deux fois plus rapide que neet python.