Отвечая на вопрос о производительности исходного опрашивающего (для поисков в dict
против set
), несколько удивительно, что dict
поисков может быть чуть-чуть быстрее (в Python 2.5.1 на моем довольно медленномнапример, при условии, что половина поисков не удалась, а половина удалась.Вот как можно выяснить:
$ python -mtimeit -s'k=dict.fromkeys(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.236 usec per loop
$ python -mtimeit -s'k=set(range(99))' '5 in k and 112 in k'
1000000 loops, best of 3: 0.265 usec per loop
делает каждую проверку несколько раз, чтобы убедиться, что она повторяется.Таким образом, если эти 30 наносекунд или меньше на медленном ноутбуке находятся в абсолютно критическом узком месте, возможно, стоит пойти на неясное dict.fromkeys
решение, а не на простое, очевидное, читаемое и четко правильное set
(необычно -почти всегда в Python простое и прямое решение также имеет преимущества в производительности).
Конечно, нужно проверять собственную версию Python, машину, данные и соотношение успешных и неудачных тестов и подтвердите с чрезвычайно точным профилированием, что сокращение 30 наносекунд (или что-то еще) от этого поиска будет иметь важное значение.
К счастью, в подавляющем большинстве случаев это окажется совершенно ненужным ... но так какпрограммисты будут зацикливаться на бессмысленных микрооптимизациях в любом случае , независимо от того, сколько раз им говорят об их неактуальности, модуль timeit
находится прямо в стандартной библиотеке, чтобыв общем-то бессмысленные микропроцессоры такие же легкие, как пирог! -)