==가 아닌 경우 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
'programing' 카테고리의 다른 글
루프가 정말 역방향으로 더 빠릅니까? (0) | 2022.12.01 |
---|---|
mysqldump는 [client]설정 섹션에서 호출기가 설정되어 있는 경우 실패한다. (0) | 2022.12.01 |
MySQL: 테이블이 많습니까, 아니면 데이터베이스가 많습니까? (0) | 2022.12.01 |
1030 스토리지 엔진에서 오류 28이 발생했습니다. (0) | 2022.12.01 |
자바에도 스톱워치가 있나요? (0) | 2022.12.01 |