if-statement with - Python에서 'empty if statement'는 어떨까요?




implement file (5)

C에서 매우 일반적입니다 : 'if if if empty'문을 해킹합니다.

if(mostlyhappencondition)
    ;#empty statement
else{
    dosomething;
}

그것은 파이썬에서 작동합니까? 내 말은, 우리는 그것을 사용하여 응용 프로그램의 성능을 향상시킬 수 있습니까? 나는 또한 이유를 알고 싶다.


Answers

바이트 코드가 "if"경우에 실행을 전달하지 않기 때문에 "if"에 else case가 없으면 성능이 향상됩니다.

여기에 몇 가지 함수와 dis.dis(foo)

다음 샘플 앱 :

def foo(x):
    if x:
        pass
    else:
        return x+2

다음으로 분해 :

5           0 LOAD_FAST                0 (x)
            3 POP_JUMP_IF_FALSE        9

6           6 JUMP_FORWARD             8 (to 17)

8     >>    9 LOAD_FAST                0 (x)
           12 LOAD_CONST               1 (2)
           15 BINARY_ADD          
           16 RETURN_VALUE        
      >>   17 LOAD_CONST               0 (None)
           20 RETURN_VALUE        

다음과 같은

def foo(x):
    if not x:
        return x+2

다음으로 분해 :

11           0 LOAD_FAST                0 (x)
             3 POP_JUMP_IF_TRUE        14

12           6 LOAD_FAST                0 (x)
             9 LOAD_CONST               1 (2)
            12 BINARY_ADD          
            13 RETURN_VALUE        
       >>   14 LOAD_CONST               0 (None)

pass 문을 찾고 있다고 생각할 수 있습니다. 문법 오류를 방지하기 위해 빈 코드 블록을 작성해야하는 경우가 있습니다.

if mostlyhappencondition:
    pass
else:
    do_something()

논리적으로 동등한이 작업을 수행하는 것이 훨씬 더 일반적입니다.

if not mostlyhappencondition:
    do_something()

여기에 상당한 성능 향상은 없습니다.


아니, 성능이 향상되지 않습니다. 사실 C 언어도 아닙니다. 어디서 들었습니까?

/ not ! 더 잘 읽고 더 많거나 적은 같은 속도를 가져야합니다.

실제로 gcc -O4 테스트되었습니다.

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(!(i < 900000000)) {
            putchar('.');
        }
    }
}

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(i < 900000000);
        else {
            putchar('.');
        }
    }
}

# 1은 6.62 초가 걸리고 # 2는 내 컴퓨터에서 6.64 초 걸렸습니다.


if True:if True: 당신은 할 수있는 시간까지 if True: 당신은 할 수 있어요.

if not mostlyhappenedcondition:
   do something()

앞으로도 "if"에 어떤 것을 넣지 않아도된다면 코드에서 중복됩니다.


현대 Python 예외를 사용하면 .message 를 남용하거나 .__str__() 또는 .__repr__() 또는 그 중 하나를 무시할 필요가 없습니다. 예외가 발생했을 때 원하는 모든 정보 메시지가 있으면 다음과 같이하십시오.

class MyException(Exception):
    pass

raise MyException("My hovercraft is full of eels")

MyException: My hovercraft is full of eels 끝나는 추적을 제공합니다 MyException: My hovercraft is full of eels 합니다.

예외로부터 더 많은 유연성을 원하면 사전을 인수로 전달할 수 있습니다.

raise MyException({"message":"My hovercraft is full of animals", "animal":"eels"})

그러나 except 블록의 세부 정보를 얻는 것은 좀 더 복잡합니다. 세부 사항은 목록 인 args 속성에 저장됩니다. 다음과 같이해야합니다.

try:
    raise MyException({"message":"My hovercraft is full of animals", "animal":"eels"})
except MyException as e:
    details = e.args[0]
    print(details["animal"])

예외에 여러 항목을 전달하고 튜플 색인을 통해 액세스 할 수는 있지만 이것이 권장 되지 않습니다. 하나 이상의 정보가 필요하고 위의 메소드가 충분하지 않은 경우 tutorial 설명 된대로 Exception 하위 클래스를 만들어야합니다.

class MyError(Exception):
    def __init__(self, message, animal):
        self.message = message
        self.animal = animal
    def __str__(self):
        return self.message






python if-statement