8. Robustness and Performance

Python 코드의 강건성과 성능을 늘려보자.

65. Take advantage of each block in try/except/else/finally.

  • try/finally 복합 명령문은 try 블록 내에서 어떤 예외가 던져졌는지에 상관없이 청소 코드가 동작하도록 해 준다.
  • else 블록은 try 블록 내의 코드를 최소화하고 try/except 블록에서 성공 경우를 시각적으로 구별한다.
  • else 블록은 성공적인 try 블록 이후 finally 블록에서의 청소 이전에 추가 동작을 수행할 때 쓰일 수 있다.

66. Consider contextlib and with statements for reusable try/finally behavior.

  • with 명령문은 try/finally 블록 내의 로직을 재사용해 시각적 노이즈를 줄일 수 있다.
  • contextlib 내장 모듈은 contextmanager 데코레이터를 제공해 함수를 with 명령문과 같이 쓸 수 있게 해준다.
  • 컨텍스트 매니저로부터 유도된 값들은 with 명령문의 as 부분에 제공된다. 이는 특별한 컨텍스트의 원인에 코드가 직접 접근할 수 있게 해 준다.

67. Use datetime instead of time for local clocks.

  • 서로 다른 시간대간 변환을 하려면 time 모듈을 쓰지 말라.
  • 서로 다른 시간대간 시간 변환을 하려면 datetime 내장 모듈과 pytz 커뮤니티 모듈을 사용하라.
  • 항상 UTC로 시간을 표현한 뒤 표기 직전에만 로컬 시간대로 변환하라.

68. Make pickle reliable with copyreg.

  • pickle 내장 모듈은 신뢰할 수 있는 프로그램간 오브젝트를 직렬화 및 재구성할 때만 유용하다.
  • 이전에 피클된 오브젝트를 재구성할 때에는 피클링 이후 포함된 클래스가 변경된 경우 망가질 수 있다.
  • pickle과 함께 copyreg 내장 모듈을 사용해서 직렬화된 오브젝트와의 하위 호환성을 보장하라.

69. Use decimal when precision is paramount.

  • Python은 실용적인 모든 유형의 산술적 값을 나타낼 수 있는 내장 모듈과 클래스를 보유하고 있다.
  • Decimal 클래스는 금전적 값 같이 높은 정밀도와 반올림 제어를 요구하는 상황에 이상적이다.
  • 정확한 답이 필요하고 부동 소수점 근사가 필요하지 않다면 float 인스턴스 대신 str 인스턴스를 Decimal 생성자에 전달하라.

70. Profile before optimizing.

  • Python 프로그램에 있어 최적화 전 프로파일링하는 것은 중요하다. 속도 저하의 원인을 파악하기 어려울 수 있기 때문이다.
  • profile 모듈 대신 cProfile 모듈을 사용하라. 더 정확한 프로파일링 정보를 제공하기 때문이다.
  • Profile 오브젝트의 runcall 메소드는 격리되어 호출되는 함수 호출 트리를 프로파일링하는 데 필요한 모든 정보를 제공한다.
  • Stats 오브젝트는 프로그램의 성능을 이해하기 위해 보아야 할 프로파일링 정보 부분을 선택하고 출력하게 해 준다.

71. Prefer deque for producer-consumer queues.

  • list 타입은 선입선출 큐로 써서 생산자가 append를 호출해 항목을 추가하고 소비자가 pop(0)을 호출해 항목을 얻을 수 있다. 하지만 pop(0)의 성능은 큐의 길이가 증가함에 따라 선형 이상으로 증가하기 때문에 문제가 될 수 있다.
  • collections 내장 모듈의 deque 클래스는 길이에 상관없이 append와 popleft에 대해 상수 시간을 가지므로 선입선출 큐에 이상적이다.

72. Consider searching sorted sequences with bisect.

  • list 내 포함된 정렬된 데이터에 대한 검색은 인덱스 법이나 단순 비교를 통한 for문을 통해서는 선형 시간이 든다.
  • bisect 내장 모듈의 bisect_left 함수는 정렬된 리스트 내의 값 탐색에 로그 시간이 드므로 다른 접근법에 대해 훨씬 빠르다.

73. Know how to use heapq for priority queues.

  • 우선 순위 큐는 선입선출 순서 대신 중요도 순서대로 항목을 처리할 수 있게 해 준다.
  • 우선 순위 큐를 쓰기 위해 list 연산을 쓴다면 큐의 크기가 커질 수록 프로그램의 성능이 선형 이상으로 하락할 것이다.
  • heapq 내장 모듈은 효율적으로 확장되는 우선 순위 큐를 구현하기 위한 모든 기능을 제공한다.
  • heapq를 쓰기 위해서는, 우선 순위가 매겨지는 항목들은 자연스러운 정렬 순서를 갖고 있어야 한다. 클래스에 대해 이 정렬 순서를 갖게 하려면 ___lt___ 메소드를 정의해야 한다.

74. Consider memoryview and bytearray for zero-copy interactions with bytes.

  • 내장 타입 memoryview는 Python의 고성능 버퍼 프로토콜을 지원하는 오브젝트 슬라이스에 대해 복사가 없는 읽기/쓰기 인터페이스를 지원한다.
  • 내장 타입 bytearray는 socket.recv_from 등의 함수에 대해 복사가 없는 읽기에 쓸 수 있는 변경 가능한 byte류 타입을 제공한다.
  • memoryview는 bytearray에 대한 래퍼로 쓰임으로써 받은 데이터를 복제 없이 임의의 버퍼 위치로 잘라 보낼 수 있게 한다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중