복붙노트

[PYTHON] Python에서 저렴한 예외 처리 기능을 제공합니까?

PYTHON

Python에서 저렴한 예외 처리 기능을 제공합니까?

이전 답변에서 파이썬에서는 예외 처리가 저렴하므로 사전 조건부 검사를해서는 안됩니다.

이전에는이 ​​내용을 들어 보지 못했지만 Python에는 비교적 익숙하지 않습니다. 예외 처리는 동적 호출과 정적 반환을 의미하는 반면 if 문은 정적 호출, 정적 반환입니다.

검사를 잘못하는 것이 어떻게 좋을지, 시도는 좋을지, 그 반대의 방법 인 것 같습니다. 누군가 나에게 이것을 설명 할 수 있습니까?

해결법

  1. ==============================

    1.이 게시물은 도움이 될 것입니다. Python에서 성능 시험 사용 / 예외 테스트 : Patrick Altman이 여러 시나리오에서 사전 조건 검사 (이 경우 사전 키에만 해당) 및 예외 만 사용하여 성능을 확인하는 간단한 테스트를 수행했습니다. . 다른 조건을 테스트하기 위해 코드를 적용하려는 경우에도 코드가 제공됩니다.

    이 게시물은 도움이 될 것입니다. Python에서 성능 시험 사용 / 예외 테스트 : Patrick Altman이 여러 시나리오에서 사전 조건 검사 (이 경우 사전 키에만 해당) 및 예외 만 사용하여 성능을 확인하는 간단한 테스트를 수행했습니다. . 다른 조건을 테스트하기 위해 코드를 적용하려는 경우에도 코드가 제공됩니다.

    그가 온 결론 :

  2. ==============================

    2.작은 것들을 땀을 내지 마라. 이미 저속 스크립팅 언어 중 하나를 선택 했으므로 opcode를 최적화하려고 시도하는 것이 도움이되지 않습니다. 파이썬과 같이 해석되고 역동적 인 언어를 선택하는 이유는 CPU가 아니라 시간을 최적화하기 위해서입니다.

    작은 것들을 땀을 내지 마라. 이미 저속 스크립팅 언어 중 하나를 선택 했으므로 opcode를 최적화하려고 시도하는 것이 도움이되지 않습니다. 파이썬과 같이 해석되고 역동적 인 언어를 선택하는 이유는 CPU가 아니라 시간을 최적화하기 위해서입니다.

    공통 언어 관용구를 사용하면 빠른 프로토 타이핑과 깔끔한 ​​디자인의 모든 이점을 볼 수 있으며 새로운 버전의 Python이 출시되고 컴퓨터 하드웨어가 업그레이드됨에 따라 코드가 더 빨리 실행됩니다.

    성능 문제가있는 경우 코드를 프로파일하고 느린 알고리즘을 최적화하십시오. 하지만 결국에는 예외적 인 상황에 대한 예외를 사용하십시오. 그러면 리팩토링이 궁극적으로이 행을 훨씬 쉽게 수행 할 수 있기 때문입니다.

  3. ==============================

    3.다른 사람들이 말한 성과 측정치를 제쳐 놓고, 지침 원칙은 "허가를 구하는 것보다 용서를 구하는 것이 더 쉽다"대 "도약하기 전에 살펴보기"와 같은 구조로 구성되는 경우가 많습니다.

    다른 사람들이 말한 성과 측정치를 제쳐 놓고, 지침 원칙은 "허가를 구하는 것보다 용서를 구하는 것이 더 쉽다"대 "도약하기 전에 살펴보기"와 같은 구조로 구성되는 경우가 많습니다.

    다음 두 단편을 고려하십시오.

    # Look before you leap
    if not os.path.exists(filename):
        raise SomeError("Cannot open configuration file")
    f = open(filename)
    

    # Ask forgiveness ...
    try:
      f = open(filename)
    except IOError:
      raise SomeError("Cannot open configuration file")
    

    동등한? 그렇지 않아. OS는 멀티 테이킹 시스템입니다. '존재'테스트와 '공개'테스트 사이에서 파일이 삭제되면 어떻게됩니까?

    파일이 있지만 읽을 수없는 경우에는 어떻게됩니까? 파일 대신 디렉터리 이름 인 경우에는 어떻게 될까요? 가능한 많은 고장 모드가있을 수 있으며, 모든 검사는 많은 작업입니다. 특히 '열린'통화가 이미 모든 가능한 실패를 확인하고보고하기 때문에.

    지침은 일관성없는 상태의 가능성을 줄이는 것이어야하며, 그 최선의 방법은 테스트 / 호출 대신 예외를 사용하는 것입니다.

  4. ==============================

    4."누군가 나에게 이것을 설명 할 수 있을까?"

    "누군가 나에게 이것을 설명 할 수 있을까?"

    달려있어.

    하나의 설명이 있지만 도움이되지 않습니다. 귀하의 질문은 귀하의 가정에 기인합니다. 실세계가 가정과 충돌하기 때문에 가정이 잘못되었음을 의미해야합니다. 설명이별로 없지만 그것이 당신이 요구하는 이유입니다.

    "예외 처리는 동적 호출과 정적 반환을 의미하는 반면 if 문은 정적 호출, 정적 반환입니다."

    '동적 호출'의 의미는 무엇입니까? 핸들러에 대한 스택 프레임 검색 중 그게 네가 말하는거야. 그리고 "정적 호출"은 어떻게 든 if 문 다음에 블록을 찾는 것입니다.

    아마도이 "동적 호출"은 작업에서 가장 값 비싼 부분이 아닙니다. 아마도 if-statement 표현식 평가는 단순한 "try-it-and-fail"보다 약간 비쌉니다.

    Python의 내부 무결성 검사는 if 문과 거의 동일하므로 어쨌든 완료해야합니다. 파이썬은 항상 체크 할 것이기 때문에 if 문은 (대부분) 중복된다.

    저수준 예외 처리에 대한 내용은 http://docs.python.org/c-api/intro.html#exceptions을 참조하십시오.

    편집하다

    더 중요한 점 : 논쟁과 논쟁은 중요하지 않습니다.

    예외는 저렴하므로 성능 문제로 분류하지 마십시오.

    코드를 명확하고 의미있는 것으로 사용하십시오. 이와 같은 미세 최적화에 시간을 낭비하지 마십시오.

  5. ==============================

    5.파이썬을 사용하면 속도에 대한 다른 가능성을 쉽게 확인 할 수 있습니다 - timeit 모듈에 대해 알아보십시오.

    파이썬을 사용하면 속도에 대한 다른 가능성을 쉽게 확인 할 수 있습니다 - timeit 모듈에 대해 알아보십시오.

    % timeit.py 'try:' '  str.__nonzero__' 'except AttributeError:' '  pass'
    100000 loops, best of 3: 15.7 usec per loop
    % timeit.py 'if hasattr(str, "__nonzero__"): pass'
    100000 loops, best of 3: 4.26 usec per loop
    % timeit.py 'try:' '  int.__nonzero__' 'except AttributeError:' '  pass'
    1000000 loops, best of 3: 1.43 usec per loop
    % timeit.py 'if hasattr(int, "__nonzero__"): pass'
    100000 loops, best of 3: 2.23 usec per loop
    

    이러한 타이밍 결과는 hasattr () 케이스에 표시되어 예외가 발생하는 속도는 느리지 만 테스트 수행은 예외를 발생시키지 않는 것보다 느립니다. 따라서 실행 시간면에서 예외적 인 경우를 다루는 예외를 사용하는 것이 이치에 맞습니다.

    편집 : 명령 줄 옵션 -n은 실행 시간이 의미가 있도록 충분히 큰 카운트를 기본값으로 사용합니다. 설명서의 인용구 :

  6. ==============================

    6.저는 파이썬 초보자입니다. 그 예외적 인 처리가 왜 그 대답의 문맥에서 싸게 불려지는지 말할 수는 없지만, 여기 내 생각은 이렇습니다 :

    저는 파이썬 초보자입니다. 그 예외적 인 처리가 왜 그 대답의 문맥에서 싸게 불려지는지 말할 수는 없지만, 여기 내 생각은 이렇습니다 :

    if-elif-else로 검사 할 때마다 조건을 평가해야합니다. 예외 처리기 검색을 비롯한 예외 처리는 예외적 인 경우에만 발생하며 대부분 예외적 인 경우가 많습니다. 이는 분명히 효율적인 이득입니다. Jay가 지적한 것처럼, 키가 없을 확률이 높은 경우 예외가 아닌 조건부 논리를 사용하는 것이 좋습니다. 이것은 키가 대부분 빠져 있으면 예외적 인 조건이 아니기 때문입니다.

    즉, 나는 당신이 효율성과 오히려 의미에 대해 걱정하지 말 것을 제안했다. 예외 처리를 사용하여 예외적 인 사례를 탐지하고 무언가를 결정할 때 조건을 검사하십시오. 나는 어제 S.Lott의 의미의 중요성에 대해 상기시켰다.

    지목 사항:

    def xyz(key):
       dictOb = {x:1, y:2, z:3}
       #Condition evaluated every time
       if dictOb.has_key(key):  #Access 1 to dict
            print dictOb[key]  #Access 2
    

    #Exception mechanism is in play only when the key isn't found.
    def xyz(key):
       dictOb = {x:1, y:2, z:3}
       try:
            print dictOb[key]  #Access 1
       except KeyError:
            print "Not Found"
    

    전반적으로, 누락 된 키와 같은 것을 처리하는 코드를 가지고 있다면, 예외 처리가 필요할 때가 있지만, 키가 항상 존재하지 않는 상황에서, 정말로 원하는 것은 키가 present => if-else. 파이썬은 당신이 의미하는 것을 강조하고 격려합니다.

    if-elif보다 예외가 선호되는 이유 ->

    노트 try-except를 사용하지 않을 경우 예외가 계속 발생합니다. 처리되지 않는 예외는 단순히 기본 처리기로 이동합니다. try-except를 사용하면 오류를 직접 처리 할 수 ​​있습니다. if-else가 조건 평가를 필요로하기 때문에 예외 핸들러를 찾는 것이 더 저렴할 수 있기 때문에 더 효율적일 수 있습니다. 이것이 사실이라 할지라도 그것으로부터 얻는 이득은 생각하기에는 너무 미미할 것입니다.

    내 대답이 도움이되기를 바랍니다.

  7. ==============================

    7.정적 대 다이나믹 호출과 리턴은 무엇입니까? 파이썬에서는 try / except 블록에서 호출과 리턴이 다르다고 생각하는 이유는 무엇입니까? 예외를 잡지 않을지라도 파이썬은 여전히 ​​호출을 처리해야 할 가능성이 있습니다. 그래서 호출과 리턴이 어떻게 처리되는지에 대해서는 파이썬과 차이가 없습니다.

    정적 대 다이나믹 호출과 리턴은 무엇입니까? 파이썬에서는 try / except 블록에서 호출과 리턴이 다르다고 생각하는 이유는 무엇입니까? 예외를 잡지 않을지라도 파이썬은 여전히 ​​호출을 처리해야 할 가능성이 있습니다. 그래서 호출과 리턴이 어떻게 처리되는지에 대해서는 파이썬과 차이가 없습니다.

    파이썬에서 모든 함수 호출은 인수를 스택에 푸시하고 호출 가능 함수를 호출하는 것과 관련이 있습니다. 모든 단일 함수 종료에는 파이썬의 내부 배선에서 호출자가 따라오고 성공 또는 예외 종료를 확인한 다음 그에 따라 처리합니다. 즉, 시도 / 예외 블록에있을 때 추가 처리가 있다고 생각하면 실수로 건너 뛴다. 나는 당신이 "정적"대 "동적"구별에 관한 것이라고 생각합니다.

    또한, 스타일 문제이며 경험 많은 파이썬 개발자는 예외 상황을 잘 읽으므로 호출 할 때 적절한 try / except를 볼 때 조건부 검사보다 읽기 쉽습니다.

  8. ==============================

    8.S.Lott이 말했듯이 일반적인 메시지는 try / except가 상처를주지 않기 때문에 적절할 때마다 자유롭게 사용하도록해야한다는 것입니다.

    S.Lott이 말했듯이 일반적인 메시지는 try / except가 상처를주지 않기 때문에 적절할 때마다 자유롭게 사용하도록해야한다는 것입니다.

    이 논쟁은 종종 "LBYL vs EAFP"라고 불리우며, "도약하기 전에 본다"와 "허가보다 용서를 구하기 쉽다"를 비교합니다. Alex Martelli는 http://mail.python.org/pipermail/python-list/2003-May/205182.html에서이 주제에 대해 무게를 쓴다.이 논쟁은 거의 6 년이나되었지만 기본적인 문제는 매우 많이 바뀌었다.

  9. from https://stackoverflow.com/questions/598157/cheap-exception-handling-in-python by cc-by-sa and MIT license