본문 바로가기

반응형

Computer

(114)
제너레이터와 yield (2) - 피보나치, 무한급수 제너레이터와 yield (1) 이번 포스트에서는 피보나치 수를 계산하는 함수를 리스트를 채워 넣는 방식과 제너레이터를 사용하는 방식으로 구현해 보겠습니다. 0부터 시작하는 피보나치 수를 계산합니다. def fibonacci_list(num_iters): numbers = [] a, b = 0, 1 while len(numbers) num_iters: break fibonacci_list 함수는 원하는 개수의 ..
사전과 네임스페이스 파이썬의 Namespace와 Scope 지난 포스트에서 살펴봤듯이 파이썬에서는 변수, 함수, 모듈이 사용될 때 그 객체를 어디서 찾을지 결정하는 Local - Global - Built-in 계층이 존재합니다. 가장 먼저 모든 지역 변수를 담은 locals() 배열을 찾습니다. locals() 배열은 함수 호출 시 만들어지는 스택 프레임 안의 지역 변수 영역을 의미하고, 어떤 함수 안에서 자신의 지역 변수에 접근할 때는 그 변수가 스택 프레임 내의 지역 변수 영역에서 몇 번째에 있는가를 이미 알기에 색인을 사용해 빠르게 접근할 수 있습니다. 여기서 해당 객체를 찾을 수 없으면 globals() 사전에서 찾게 됩니다. globals() 에서도 찾을 수 없다면 마지막으로 __builtin__ 객체에서 찾습니..
프로파일링 (5) - 바이트코드: 내부작동 이해하기 프로파일링 (1) - 줄리아 집합 (Julia set) 프로파일링 (2) - 함수 실행 시간 계산하기 프로파일링 (3) - cProfile 모듈 프로파일링 (4) - line_profiler 이번 포스트에서는 지금까지 알아본 파이썬 코드의 CPU / RAM 사용량 측정 이외에 파썬의 가상 머신 (c파이썬) 에서 사용하는 내부 바이트코드에 대해 살펴보겠습니다. 파이썬 코드가 가상 머신 안에서 실제로 어떻게 동작하는지 이해하면, 느리게 동작하는 함수에 대해 더 깊은 파악이 가능합니다. 여기서 사용하는 모듈은 "dis" 라고 하는 파이썬 기본 내장 모듈로서 코드나 모듈을 넘기면 역어셈블 결과를 출력해줍니다. julia 코드에서 $z$를 계산하는 코드에 대해서만 역어셈플 결과를 살펴보면 다음과 같습니다. >>>..
프로파일링 (4) - line_profiler 프로파일링 (1) - 줄리아 집합 (Julia set) 프로파일링 (2) - 함수 실행 시간 계산하기 프로파일링 (3) - cProfile 모듈 line_profiler cProfile 모듈은 표준 라이브러리에 내장된 프로파일링 도구로 함수 단위로 병목을 찾아줄 수 있는 매우 편리한 도구지만 해당 함수 블록 안에서 line by line 단위의 프로파일링은 해줄 수 없습니다. 이때 사용할 수 있는 강력한 도구가 로버트 컨 (Robert Kern) 이 개발한 line_profiler 입니다. pip install line_profiler 위 명령어를 이용해 line_profiler를 설치하고 cProfile로 가장 큰 병목이 걸렸던 "calculate_z" 함수에 @profiler 데코레이터를 추가합니다...
프로파일링 (3) - cProfile 모듈 프로파일링 (1) - 줄리아 집합 (Julia set) 프로파일링 (2) - 함수 실행 시간 계산하기 Cprofile 모듈이란 ? cProfile은 표준 라이브러리에 내장된 프로파일링 도구로, C파이썬의 가상 머신 안에서 확인되는 모든 함수에 시간을 측정하는 장치를 연결합니다. 표준 라이브러리에서 제공하는 다른 프로파일러는 순수 파이썬 기반의 profile이 있지만 오버헤드를 줄이기 위해 C로 작성한 cProfile에 비해 현저히 느립니다. cProfile은 line by line 별로 분석하지는 못하지만, 기본 내장된 도구로 편리하고 빠르게 병목 지점을 찾을 수 있습니다. 줄리아 집합 프로파일링 지난 포스트에서 작성한 줄리아 집합에 대해 cProfile 모듈을 이용하여 프로파일링 해보곘습니다. 일단 다..
프로파일링 (2) - 함수 실행 시간 계산하기 프로파일링 (1) - 줄리아 집합 (Julia set) 지난 포스트에서는 time 라이브러리와 print 함수를 이용해 함수 시작과 끝에서 시각을 측정하는 방식으로 계산했습니다. 하지만 실행 시간은 네트워크, 디스크, RAM 접근하는 시간 및 환경에 따라 편차가 발생하며, 반복 측정하면 정규 분포가 나와야 합니다. (저는 구글 colab pro Jupyter 노트북을 이용했습니다) 데코레이터 print 문 기반 시간 측정은 간단하지만 코드가 금방 더렵해지고 모든 함수 내부에 일일해 print 문을 선언해줘야 하는 귀찮음이 발생합니다. 따라서 시간을 측정하려는 함수 위에 데코레이터를 추가하는 방식으로 조금 더 깔끔하게 구현할 수 있습니다. 다음 코드를 보면 timefn 이라는 데코레이터는 내부에 measu..
프로파일링 (1) - 줄리아 집합 (Julia set) 파이썬은 C/C++ 과 같은 컴파일 기반 언어에 비해 느립니다. 하지만 프로파일링으로 프로그램 속도의 병목 지점을 찾아 최소한의 노력으로도 성능을 최대한 끌어올릴 수 있습니다. 파이썬에서는 timeit 같은 매직 명령어와 cProfile, line_profiler, memory profiler 등의 여러 프로파일 패키지 및 함수를 제공하며, 이를 통해 병목이 발생하는 함수, 함수 안의 라인까지도 소요 시간/메모리 등을 자세하게 측정할 수 있고 CPU 뿐만 아니라 GPU, 네트워크 대역폭, 디스크 I/O 등 사용되는 거의 모든 리소스에 대해서 측정할 수 있습니다. 줄리아 집합 (Julia set) 줄리아 집합은 가스통 줄리아가 고안한 프랙탈의 일종으로 주어진 복소수 $c$에 대해서 다음 점화식에 따라 정의..
최소 지식의 원칙과 클래스 메소드 클래스를 이용하여 이런 저런 멤버 변수 및 인스턴스 메서드를 정의하다 보면 어떤 한 메서드에서 멤버 변수를 바뀐 것이 다른 메서드에 영향을 끼치는 경우가 많습니다. 클래스의 기능이 복잡해지고 변수가 많아질 수록 이런 경우가 종종 발생하게 되는데요, self 를 이용한 멤버 변수는 어떠한 인스턴스 메서드에서 접근 가능하다보니 이러한 가능성을 최대한 배제시킬 수 있는 설계 원칙이 필요합니다. 이때 머리 속에 담아두어야 할 것은 디미터의 법칙 혹은 최소 지식의 원칙입니다. 최소 지식의 원칙 최소 지식의 원칙은 객체 지향 구현 시 각 모듈 간의 결합도를 최소화하여 설계한다는 원칙입니다. 만일 어떤 한 메소드에 강한 결합도를 가진 변수, 다른 메소드 등이 있다면 결합도가 높은 메소드가 수정될 경우 다른 많은 곳에..

반응형