programing

==가 아닌 경우 Python vs!=

yoursource 2022. 12. 1. 23:44
반응형

==가 아닌 경우 Python vs!=

이 두 줄의 코드의 차이점은 무엇입니까?

if not x == 'val':

그리고.

if x != 'val':

한쪽이 다른 쪽보다 더 효율적입니까?

사용하는 것이 좋을까요?

if x == 'val':
    pass
else:

를 사용하여 두 가지 버전에 대해 생성된 바이트 코드를 확인합니다.

not ==

  4           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 RETURN_VALUE   

!=

  4           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               3 (!=)
              9 RETURN_VALUE   

후자는 조작이 적기 때문에 효율이 약간 향상될 가능성이 있습니다.


코멘트(@Quincunx)에 다음과 같이 기재되어 있습니다.if foo != bar대.if not foo == bar수술 횟수는 정확히 똑같습니다. 다만, 그 이유는COMPARE_OP변경 및POP_JUMP_IF_TRUE전환하다POP_JUMP_IF_FALSE:

다음과 같습니다not ==.

  2           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               2 (==)
              9 POP_JUMP_IF_TRUE        16

!=

  2           0 LOAD_FAST                0 (foo)
              3 LOAD_FAST                1 (bar)
              6 COMPARE_OP               3 (!=)
              9 POP_JUMP_IF_FALSE       16

이 경우 각 비교에 필요한 작업량에 차이가 없는 한 성능 차이는 거의 없을 것입니다.


단, 두 버전이 논리적으로 항상 동일한 것은 아니라는 점에 유의해 주십시오.이것은, 다음의 실장에 의해서 다릅니다.__eq__그리고.__ne__대상 오브젝트에 대해 설명합니다.데이터 모델 매뉴얼에 따르면:

비교 연산자 사이에 암묵적인 관계가 없습니다.의 진실x==y을 의미하는 것은 아니다x!=y거짓입니다.

예를 들어 다음과 같습니다.

>>> class Dummy(object):
    def __eq__(self, other):
        return True
    def __ne__(self, other):
        return True


>>> not Dummy() == Dummy()
False
>>> Dummy() != Dummy()
True

마지막으로, 아마도 가장 중요한 것은, 일반적으로 두 가 논리적으로 동일한 경우보다 훨씬읽기 쉽다는 것입니다.

@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':그리고.if x != 'val':이 중에서if x != 'val':가장 빠릅니다.

하지만, 가장 놀라운 것은, 우리가 볼 수 있는 것은

if x == 'val':
        pass
    else:

사실 가장 빠르고 박동도 빨라요.if x != 'val':~0.3%입니다.읽기 쉽지는 않지만 성능 향상이 미미하다면 이 방법을 택할 수 있을 것 같습니다.

첫 번째는 Python은 필요 이상의 조작을 실행해야 합니다(단순히 동일하지 않은 것을 체크하는 것이 아니라 사실이 아닌지를 체크해야 하므로 1개의 조작이 더 필요합니다).한 번의 실행과 차이를 구별하는 것은 불가능하지만 여러 번 실행하면 두 번째 실행이 더 효율적입니다.전체적으로 두 번째 것을 사용하지만 수학적으로는 동일합니다.

하나 주의할 점은, 을 맞췄기 에, 에서 '하다'만 정의하면 .__eq__() and__ne__()그에, 「」, 「」를 참조해 주세요.COMPARE_OP (!=)__eq__()세 번째 해야 합니다.그 때는 세 번째 옵션이 조금 더 효율적일 수 있지만, 빠르게 이해하기 어렵기 때문에 속도가 필요한 경우에만 고려해야 합니다.

>>> 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따라서 수백만 번의 비교를 하지 않는 한 대부분의 경우 성능 차이는 매우 작습니다.또한 이것이 병목현상의 원인이 되지 않을 가능성이 높습니다.

을 사용법 not'동적'으로 할 수 .

if not x == 'val':

★★★★★★★★★★★★★★★★★.!= 할 수 ==

위의 가독성 코멘트에 대해 자세히 설명하겠습니다.

다시 말씀드리지만, 다른 (성능이 중요하지 않은) 우려 사항보다 가독성이 우선시되는 것에 전적으로 동의합니다.

제가 지적하고 싶은 것은 뇌가 "긍정적"을 "부정적"보다 더 빨리 해석한다는 것입니다.예: "정지" vs"do not go"(단어 수의 차이로 인해 다소 형편없는 예)

선택지가 주어집니다.

if a == b
    (do this)
else
    (do that)

는 기능적으로 정합성이 없는 것보다 바람직합니다.

if a != b
    (do that)
else
    (do this)

가독성/가해성이 떨어지면 버그가 증가합니다.초기 코딩은 아니지만 유지보수가 변경됩니다.

언급URL : https://stackoverflow.com/questions/31026754/python-if-not-vs-if

반응형