Python if not == vs if! =


Answers

@jonrsharpe имеет отличное объяснение того, что происходит. Я думал, что просто покажу разницу во времени при запуске каждого из 3 вариантов 10 000 000 раз (достаточно для небольшой разницы, чтобы показать).

Используемый код:

def a(x):
    if x != 'val':
        pass


def b(x):
    if not x == 'val':
        pass


def c(x):
    if x == 'val':
        pass
    else:
        pass


x = 1
for i in range(10000000):
    a(x)
    b(x)
    c(x)

И результаты профилирования cProfile:

Таким образом, мы видим, что разница между ~ 0,7% между if not x == 'val': составляет ~ 0,7%, if not x == 'val': и if x != 'val': Из них, if x != 'val': самый быстрый.

Однако, самое удивительное, мы видим, что

if x == 'val':
        pass
    else:

на самом деле самый быстрый и бьет, if x != 'val': на ~ 0,3%. Это не очень читаемо, но я думаю, если бы вы хотели незначительное улучшение производительности, можно было бы спуститься по этому маршруту.

Question

В чем разница между этими двумя строками кода:

if not x == 'val':

а также

if x != 'val':

Является ли более эффективным, чем другой?

Было бы лучше использовать

if x == 'val':
    pass
else:



Речь идет о вашем способе чтения. not оператор динамический, поэтому вы можете применить его в

if not x == 'val':

Но != Можно прочитать в лучшем контексте как оператор, который делает противоположное тому, что делает.




>>> from dis import dis
>>> dis(compile('not 10 == 20', '', 'exec'))
  1           0 LOAD_CONST               0 (10)
              3 LOAD_CONST               1 (20)
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT
             10 POP_TOP
             11 LOAD_CONST               2 (None)
             14 RETURN_VALUE
>>> dis(compile('10 != 20', '', 'exec'))
  1           0 LOAD_CONST               0 (10)
              3 LOAD_CONST               1 (20)
              6 COMPARE_OP               3 (!=)
              9 POP_TOP
             10 LOAD_CONST               2 (None)
             13 RETURN_VALUE

Здесь вы можете видеть, что not x == y имеет еще одну инструкцию, кроме x != y Таким образом, разница в производительности будет очень мала в большинстве случаев, если вы не делаете миллионы сравнений, и даже тогда это, вероятно, не станет причиной узкого места.




Related