effectivepython 11

memoryview 성능 테스트 ( feat.timeit, 버퍼프로토콜 )

timeit 라이브러리는 작은단위의 코드에 실행시간을 테스트할 수 있는 유용한 도구입니다. 이 도구를 사용하여 파이썬에서 제공해주는 단순한 바이트배열과 memoryview 라는 객체를 활용하였을 때 성능적으로 얼마나 큰 차이점이 발생하고 왜 이런 차이점이 발생하는지 알아보겠습니다 import os import timeit video_data = 100 * os.urandom(1024 * 1024) byte_offset = 1234 size = 20 * 1024 * 1024 def run_test(): chunk = video_data[byte_offset:byte_offset + size] result = timeit.timeit( stmt='run_test()', globals=globals(), nu..

asyncio를 활용해 간단하게 서버 구현한 코드 리뷰하기

asyncio로 서버를 구성하는 코드예제를 보고, 그냥 넘어가는 것보단 정리하면서 개념도 같이 정리해보면 좋을 것 같아서 코드리뷰 느낌으로 글을 작성해보았습니다! 전체코드를 보고 싶으신 분들은 아래 깃헙주소를 참고해주시면 좋을 것 같아요 https://github.com/bslatkin/effectivepython/blob/master/example_code/item_61.py#L278 또한 해당 코드에서의 목적은 클라이언트와 서버와의 숫자맞추기 게임로직을 구현한 것인데, 게임로직 함수 구현내용은 거의 생략을 했음을 참고해주시면서 보면 좋을 것 같습니다. 코드는 최대한 발생순서대로 정리하였습니다 async def main_async(): address = ('127.0.0.1', 4321) server ..

소켓코드를 보고 현상정리 ( feat. 버퍼 )

class EOFError(Exception): pass # 서버는 한번에 하나씩 처리, 클라이언트 세션상태 유지하는 클래스 class ConnectionBase: # 3 def __init__(self, connection): self.connection = connection self.file = connection.makefile('rb') def send(self, command): line = command + '\\n' data = line.encode() self.connection.send(data) def receive(self): line = self.file.readline() if not line: raise EOFError('Connection closed') return line..

컨텍스트 스위칭으로부터의 예상치 못한 결과 ( feat.GIL )

파이썬에서 동시성,병렬성에 대한 학습을 하면서 이해했던 것들을 재검토하는 시간에 Thread 안에 subprocess를 만나면 블로킹을 하고 다음 Thread로 넘어가는지에 대한 궁금증이 생겼다 바로 코드로 확인해보았다 import threading import subprocess import time def run_command(): print("Starting command...") subprocess.run(["sleep", "5"]) # 5초 동안 sleep하는 외부 명령 print("Command finished.") def do_other_stuff(): for i in range(3): print("Doing other stuff...") time.sleep(1) run_command() d..

Thread와 Queue를 활용한 파이프라인 구현하기( feat. 콘웨이 생명게임 )

더보기 콘웨이의 생명 게임(Conway's Game of Life)은 1970년에 수학자 존 콘웨이(John Conway)에 의해 고안된 세포 자동자(cellular automaton)입니다. 이 게임은 "게임"이라는 이름을 가지고 있지만, 플레이어의 참여 없이 자동으로 진행되는 시뮬레이션입니다. 게임의 규칙은 다음과 같습니다: 생존: 어떤 세포에 인접한 8개의 세포 중 정확히 2개 또는 3개가 살아 있으면, 다음 세대에서 그 세포는 살아 있습니다. 사망: 어떤 세포에 인접한 8개의 세포 중 살아 있는 세포가 2개 미만이면, 그 세포는 고립되어 사망합니다. 또한, 살아 있는 세포가 3개 초과로 인접해 있으면, 그 세포는 과밀로 인해 사망합니다. 번식: 어떤 세포에 인접한 8개의 세포 중 정확히 3개가 살..

파이썬에서 외부 터미널 명령어 사용하기 ( subprocess )

파이썬에서 subprocess 를 활용해 자식 프로세스를 실행하면서, 자식 프로세스의 입출력 스트림을 관리 및 활용할 수 있습니다 import subprocess result = subprocess.run(['echo', 'Hello from subprocess!'], capture_output=True, text=True) print(result.stdout) # Hello from subprocess! 위 코드를 통해 subprocess에 터미널 명령을 넣어주면 아래와 같은 결과값을 얻을 수 있음을 확인할 수 있습니다. 만약 내가 터미널 명령을 통한 결과값을 이용해 파이프라인을 구축하고 싶다면 Popen 클래스를 활용해 유닉스 스타일의 파이프라인을 구축해볼 수 있을 것 같은데요. 여기서 유닉스 스타일..

GIL를 무조건 신뢰하면 안되는 이유( feat.스레드 감수성 )

나는 생각했다. 그러면 GIL 때문에 쓰레드 작업에서 락걸거나, 따로 통제할 필요가 없겠네. GIL 특성상 무조건 딱 하나의 스레드만 실행시켜주니깐! 하지만 이 말은 틀렸다. GIL는 동시접근을 보장해주는 락역활이라고 생각했지만 그렇지않다. 그 이유는 코드로 확인해보자. class Counter: def __init__(self): self.count = 0 def increment(self, offset): self.count += offset def worker(sensor_index, how_many, counter): BARRIER.wait() for _ in range(how_many): counter.increment(1) # Example 3 from threading import Barri..

두 코드의 차이점을 설명하시요( feat. Python,쓰레드, GIL, 병렬 I/O)

import select import socket def slow_systemcall(): select.select([socket.socket()], [], [], 0.1) start = time.time() for _ in range(5): slow_systemcall() end = time.time() delta = end - start print(f'Took {delta:.3f} seconds') # Took 0.526 seconds import select import socket def slow_systemcall(): select.select([socket.socket()], [], [], 0.1) start = time.time() threads = [] for _ in range(5): t..

디스크립터 __set_name__ 의 활용방법

__ set_name __ 를 활용하기 이전에, 해당 디스크립터가 필요하게 된 상황을 알아보자 class Field: def __init__(self, name): self.name = name self.internal_name = '_' + self.name def __get__(self, instance, instance_type): if instance is None: return self return getattr(instance, self.internal_name, '') def __set__(self, instance, value): setattr(instance, self.internal_name, value) class Customer: first_name = Field('first_nam..

메타클래스와 init_subclass

이펙티브 파이썬에서 메타클래스를 사용을 하여 기존의 클래스들을 리팩토링하는 방법들을 제시해주었다. 훌륭한 제안들을 아무 생각없이 읽다가 문득, 응? 근데 메타클래스가 뭐임? 한마디로 처음부터 다시 읽어야 했다. 메타클래스란 클래스 생성하는 것을 제어하는 클래스라고 볼 수 있다. 나는 이 정의를 보고 클래스를 vaildation 해주는 클래스라고 이해했다. 클래스의 클래스 랄까? 정의를 보았으니 메타클래스가 만들어진 흐름까지 보고 싶었다. 파이썬 초기버전: 파이썬의 초기 버전에서는 메타클래스와 같은 개념이 명확하게 존재하지 않음. 대신 클래스와 타입은 별개의 것으로 취급. 이 때문에 일반 사용자 클래스와 내장 타입 (예: 리스트, 딕셔너리) 사이에 뚜렷한 차이존재. 파이썬 2.x 시리즈: 파이썬 2.x에서..