본문 바로가기

반응형

Computer/Python

(57)
프로파일링 (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 를 이용한 멤버 변수는 어떠한 인스턴스 메서드에서 접근 가능하다보니 이러한 가능성을 최대한 배제시킬 수 있는 설계 원칙이 필요합니다. 이때 머리 속에 담아두어야 할 것은 디미터의 법칙 혹은 최소 지식의 원칙입니다. 최소 지식의 원칙 최소 지식의 원칙은 객체 지향 구현 시 각 모듈 간의 결합도를 최소화하여 설계한다는 원칙입니다. 만일 어떤 한 메소드에 강한 결합도를 가진 변수, 다른 메소드 등이 있다면 결합도가 높은 메소드가 수정될 경우 다른 많은 곳에..
파이썬 dataclasses 표준 라이브러리 파이썬 3.7 버젼은 3.x 버젼에서 유독 중요한 변경 사항이 많이 반영된 버젼입니다. 그 중에 특이할 점은 dataclasses 라는 표준 라이브러리가 소개되었다는 점인데요, 저도 최근에야 사용하기 시작했는데, 파이썬 클래스 작성 시 매우 효율적으로 코드를 구성할 수 있어 소개하고자 합니다. 파이썬의 클래스를 선언하려면 __init__ 메소드에 많은 아규먼트를 전달해주어야 하고 아규먼트가 줄거나 늘때마다 __init__ 메소드 안에서 인스턴스 멤버 변수로 선언해주는 코드 또한 매번 작성해야 했습니다. 따라서 __init__ 메소드에 전달해야 하는 아규먼트가 늘어날 수록 불필요한 코드의 양이 증가하게 됩니다. dataclasses 라이브러리를 사용하면 코드를 훨씬 컴팩트하게 작성할 수 있는데요, towa..
정규표현식을 이용해 문자열에서 숫자 찾기 최근에 급히 여러 줄로 이루어진 텍스트로부터 각 줄마다 숫자를 찾아야 할 일이 있었습니다. 텍스트 파일 형식은 xml과 유사한 처음 보는 파일 형식으로 원래는 관련 파이썬 라이브러리 (BeautifulSoup, xml 등등..)를 이용해 해결하고자 했으나 잘 안되더군요. 마음이 급한 와중에 생각한 것이 텍스트 파일의 규격이 일정하기에 정규표현식 (regular expression)을 이용하면 어떨까 생각해서 급히 stack overflow를 뒤져보던 중 다음과 같은 깔끔한 코드 스니펫을 발견했습니다. import re # Format is [(, ), ...] ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3", ['-12.34', '33', '..
Property와 descriptor (디스크립터) 지난 포스트에서 클래스의 어트리뷰트의 값을 정하고 불러오는 @property와 setter, getter 메소드에 대하여 알아봤습니다. 하지만 @property 데코레이터의 단점으로는 @property가 데코레이션하는 메서드를 같은 클래스에 속하는 여러 애트리뷰트로 사용할 수 없고 서로 무관한 클래스 사이에서 @property 데코레이터를 적용한 메서드를 재사용할 수 없습니다. 예를 들어 학생에게 여러 과목의 시험 성적 점수를 별도로 부여하고 싶다고 합시다. class Exam: def __init__(self): self._writing_grade = 0 self._math_grade = 0 @staticmethod def _check_grade(value): if not (0 >> first_exam..

반응형