Возможно, это зависит от того, находитесь ли вы в python 2 или python 3. В python 2 единственной «медленной» операцией является «== None». Я думал, что это потому, что целые числа в низких диапазонах были запроектированными объектами, но на самом деле это не имело значения.
In [53]: x = 0
In [54]: %timeit x is 0
10000000 loops, best of 3: 38 ns per loop
In [55]: %timeit x == 0
10000000 loops, best of 3: 36.5 ns per loop
In [56]: x = 1
In [57]: %timeit x is 0
10000000 loops, best of 3: 37.3 ns per loop
In [58]: %timeit x == 0
10000000 loops, best of 3: 36.5 ns per loop
In [59]: %timeit x is None
10000000 loops, best of 3: 38.1 ns per loop
In [60]: %timeit x == None
10000000 loops, best of 3: 82.9 ns per loop
Теперь, в первых 3-х случаях, х является INT, который имеет тот же тип в первых 3-х случаях, а не в последнюю очередь. Так попробовал еще одну вещь, что делает ха строку, поэтому она не будет соответствовать типу с 0:
In [62]: x = 'x'
In [63]: %timeit x is 0
10000000 loops, best of 3: 38.7 ns per loop
In [64]: %timeit x == 0
10000000 loops, best of 3: 92.5 ns per loop
In [65]: %timeit x is None
10000000 loops, best of 3: 39.1 ns per loop
In [66]: %timeit x == None
10000000 loops, best of 3: 77.1 ns per loop
В этом случае, «не» по-прежнему довольно быстро, независимо от того, какие типы, при проверке смешанного типа равенства медленнее. Это имеет смысл, так как «is» - это просто проверка равенства на id, тогда как equals могут быть произвольно медленными.
Это означает, что если вы действительно беспокоитесь об этом (вам, вероятно, не нужно упоминаться, если это не указано во внутреннем цикле), вы должны создать объект-дозор (в любое время), а затем использовать is
, чтобы проверить его непосредственно. None
является удобным, если он не является допустимым значением; 0
или -1
могут выполнять ту же роль. Но это не обязательно.
Как @zybjtu просто указал на мой ответ, если 'doSomething()' следует вызывать, если 'somefunction()' возвращает '0', ваши предложенные изменения нарушают код. – jonrsharpe
@MartijnPieters, как обычно: острые глаза! исправлено. – Oz123
Скажите, что '== 0' стоит 5 центов,' is None' стоит 2 цента, а 'except' стоит 1000 долларов. $ 1000.02 действительно дешевле, чем $ 1000,05? – georg