Что эффективнее в Python: «ключ не в списке» или «ключ не в списке»?

Только что узнал, что оба синтаксических способа действительны.

Что эффективнее?

element not in list

Or:

not element in list

?


person Javier Novoa C.    schedule 28.08.2018    source источник
comment
Почему только эти, ?, может быть, например, т.е. (a is not None или not a is None) и т.д..   -  person U11-Forward    schedule 28.08.2018


Ответы (2)


Они ведут себя одинаково, вплоть до создания идентичного байтового кода; они одинаково эффективны. Тем не менее, element not in list обычно считается предпочтительным. В PEP8 нет конкретных рекомендаций по not ... in и ... not in, но есть рекомендации по not ... is и ... is not, и предпочитает последнее:

Используйте оператор is not вместо not ... is. Хотя оба выражения функционально идентичны, первое более читабельно и предпочтительно.

Чтобы показать эквивалентность в производительности, быстрая проверка байт-кода:

>>> import dis
>>> dis.dis('not x in y')
  1           0 LOAD_NAME                0 (x)
              2 LOAD_NAME                1 (y)
              4 COMPARE_OP               7 (not in)
              6 RETURN_VALUE

>>> dis.dis('x not in y')
  1           0 LOAD_NAME                0 (x)
              2 LOAD_NAME                1 (y)
              4 COMPARE_OP               7 (not in)
              6 RETURN_VALUE
person ShadowRanger    schedule 28.08.2018

Когда вы делаете:

not x in y

И если x находится в y, это в основном упростится до not True, то есть:

>>> not True
False

С другой стороны, x not in y просто проверяет not in

Чтобы увидеть тайминги (всегда очень похожие):

>>> import timeit
>>> timeit.timeit(lambda: 1 not in [1,2,3])
0.24575254094870047
>>> timeit.timeit(lambda: not 1 in [1,2,3])
0.23894292154022878
>>> 

Кроме того, not в основном просто сделайте наоборот (если что-то истинно, не сделает это ложным, то же самое с противоположным

См. not оператор.

person U11-Forward    schedule 28.08.2018
comment
@Downvoter, почему минус - person U11-Forward; 28.08.2018
comment
Я не минусовал, но ваши собственные ссылки показывают, что байт-код тот же, так что... - person juanpa.arrivillaga; 28.08.2018
comment
@juanpa.arrivillaga Это правда, извините за это, ???? - person U11-Forward; 28.08.2018