분류 전체보기 (369) 썸네일형 리스트형 제너레이터와 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__ 객체에서 찾습니.. 자료구조 - 해시 함수와 엔트로피 해시 함수 파이썬의 객체는 이미 __hash__, __cmp__ 함수를 구현하므로 일반적으로 해시가 가능합니다. int나 float 같은 산술 타입은 수의 bit를 기반으로 해시값을 구하고 튜플과 문자열은 내용을 기반으로 해시값을 구합니다. 다만, 리스트는 값과 크기가 변경될 수 있으므로 해시를 지원하지 않습니다. (리스트의 값이 변경되면 리스트를 나타내는 해시값이 엉뚱한 색인을 참조할 수 있기에 사전의 키로 사용할 수 없습니다) 사용자 정의 클래스에서는 어떨까요? 기본 __hash__ 함수는 내장 함수인 id 함수를 이용해서 객체의 메모리 함수를 반환하고 __cmp__ 함수는 객체의 메모리 위치를 산술 비교합니다. 일반적으로 어떤 클래스의 두 인스턴스는 서로 다르고 해시 테이블 내에서 충돌이 발생하지 .. 자료구조 - 사전과 셋 (Dictionary, Set) 개요 셋과 사전은 삽입 순서를 제외하면 미리 정해진 순서로 정해지지는 않으나 (파이썬 3.7 부터 딕셔너리에 값을 추가한 순서가 보존됩니다) 특정 데이터를 고유하게 참조할 수 있는 별도 객체가 있을 때 매우 적합한 자료구조 입니다. 알다시피 참조 객체를 "키", 특정 데이터를 "값" 이라고 칭하며, 키는 해시가 가능하다면 (hashable) 어떤 타입이도 상관 없습니다. 사전과 셋은 거의 같지만 셋에는 값이 없고 유일한 키를 저장하는 자료구조입니다. 해쉬가 가능한 타입이란 ? 해쉬가 가능한 타입은 __hash__ 매직 함수, 그리고 키 값 비교를 위한 __eq__ 혹은 __cmp__ 매직 함수를 구현한 타입입니다. 파이썬의 내장 타입 (dict, set 등)은 모두 이를 구현하였기에 사용자가 사용할 때는.. 프로파일링 (5) - 바이트코드: 내부작동 이해하기 프로파일링 (1) - 줄리아 집합 (Julia set) 프로파일링 (2) - 함수 실행 시간 계산하기 프로파일링 (3) - cProfile 모듈 프로파일링 (4) - line_profiler 이번 포스트에서는 지금까지 알아본 파이썬 코드의 CPU / RAM 사용량 측정 이외에 파썬의 가상 머신 (c파이썬) 에서 사용하는 내부 바이트코드에 대해 살펴보겠습니다. 파이썬 코드가 가상 머신 안에서 실제로 어떻게 동작하는지 이해하면, 느리게 동작하는 함수에 대해 더 깊은 파악이 가능합니다. 여기서 사용하는 모듈은 "dis" 라고 하는 파이썬 기본 내장 모듈로서 코드나 모듈을 넘기면 역어셈블 결과를 출력해줍니다. julia 코드에서 $z$를 계산하는 코드에 대해서만 역어셈플 결과를 살펴보면 다음과 같습니다. >>>.. 확률 이야기 - 몬티홀 문제와 베이즈 정리 학부/대학원 시절을 거치면서 공부한 여러 수학 분야들 중에 저에게 가장 안 맞는 수학 분야는 확률이었습니다. 측도론 기반의 콜모고로프 확률론으로부터 개념을 정립하고 여기서 확률 과정까지 나아가는 과정은 아무리 수학이 추상체를 구체화하는 학문임을 감안하더라도 꽤나 잘 안 와닿았던 기억이 납니다. 어려웠던 확률 시험을 통과하고 논문에 적힌 복잡한 수식을 이해했더라도 나만의 문제에 맞게 formulation 할 수 있는 단계로 나아가기엔 또 다른 장벽이 존재했습니다. 지금 돌이켜 생각해 보면, 개념/시험/논문 등을 떠나서 근본적인 확률론적 사고가 부족했기 때문이 아닌가 생각합니다. 바로 몬티홀 문제를 접하면서 말이죠. 몬티홀 문제 2008년 개봉한 이라는 영화에서는 MIT 천재들이 수학 (특히 확률)에 기반하.. 프로파일링 (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 모듈을 이용하여 프로파일링 해보곘습니다. 일단 다.. 이전 1 ··· 4 5 6 7 8 9 10 ··· 47 다음