본문 바로가기

반응형

Computer/Python

(57)
행렬과 벡터 연산 (4) - numpy 배열을 이용한 확산 방정식 행렬과 벡터 연산 (1) - 확산 방정식 예제 행렬과 벡터 연산 (2) - 확산 방정식 순수 파이썬 구현 행렬과 벡터 연산 (3) - 파이썬 리스트와 numpy 연산 속도 차이 지난 포스트에서 numpy 배열을 이용하면 메모리의 지역성과 CPU 벡터화 기능의 장점으로 행렬/벡터 연산에서 굉장한 성능 향상을 얻을 수 있음을 보았습니다. 그렇다면 지난 번에 파이썬 리스트로 구현했던 확산 방정식을 numpy 배열을 이용해 구현해 보겠습니다. 행렬과 벡터 연산 (2) - 확산 방정식 순수 파이썬 구현 [개발 잡학/Python] - 행렬과 벡터 연산 (1) - 확산 방정식 예제 지난 포스트의 의사 코드를 기반으로 순수 파이썬으로 (특히 리스트) 구현해 보겠습니다. 먼저 행렬을 받아 변화된 상태를 반환하는 e ho..
행렬과 벡터 연산 (3) - 파이썬 리스트와 numpy 연산 속도 차이 행렬과 벡터 연산 (1) - 확산 방정식 예제 행렬과 벡터 연산 (2) - 확산 방정식 순수 파이썬 구현 지난 포스트에서 확산 방정식을 파이썬 리스트로만 구현했습니다. 매 timestep 마다 확산을 모델링하기 위해서 grid 변수를 리스트의 리스트 형태로 구현했습니다. 하지만 파이썬의 리스트는 실제 데이터가 아닌 데이터가 저장된 위치를 가리키는 포인터를 저장합니다. 데이터 타입에 상관없이 리스트에 어떤 형태의 데이터도 저장할 수 있으나 이는 벡터, 행렬 연산에서 큰 성능 저하의 원인이 됩니다. 또한, 파이썬 바이트 코드는 벡터 연산에 최적화되지 않았기에 파이썬은 벡터 연산을 기본으로 제공하지 않습니다. Vectorization Numpy 연산이 매우 빠른 이유는 무엇일까요? 다음과 같이 50만개의 배열..
행렬과 벡터 연산 (2) - 확산 방정식 순수 파이썬 구현 행렬과 벡터 연산 (1) - 확산 방정식 예제 지난 포스트의 의사 코드를 기반으로 순수 파이썬으로 (특히 리스트) 구현해 보겠습니다. 먼저 행렬을 받아 변화된 상태를 반환하는 evolve 함수를 구현합니다. grid_shape = (640,640) def evolve(grid, dt, D=1.): xmax, ymax = grid_shape new_grid = [[0.,0.] * ymax for x in range(xmax)] for i in range(xmax): for j in range(ymax): grid_xx = grid[(i+1)%xmax][j] + grid[(i-1)%xmax][j] - 2. * grid[i][j] grid_yy = grid[i][(j+1)%ymax] + grid[i][(j-1..
행렬과 벡터 연산 (1) - 확산 방정식 예제 이번 시리즈 물에서는 순수 파이썬 구현과 numpy 구현의 속도 차이가 얼마만큼 나고 이러한 차이가 왜 발생하는지 알아보려 합니다. 순수 파이썬으로 문제를 구현한 이후 지난 포스트에서 살펴본 line profiler 를 이용해 연산 속도를 점진적으로 개선시킵니다. 이후 벡터 연산을 지원하는 numpy 배열을 이용해 구현하고 얼마만큼의 속도 개선을 이룰 수 있는지 보려고 합니다. 이를 살펴보기 위한 예제로는 메모리와 연산량을 매우 많이 잡아먹는 적절한 예제가 필요하겠죠. 바로 확산 방정식입니다. 확산 방정식 확산은 유체가 공간에서 퍼지는 양상을 나타낸 수식입니다. 예를 들어 실온의 물에 물감을 몇 방울 떨어뜨리면 물감이 천천히 퍼지면서 물과 완전히 섞일 때까지 움직이는데, 물을 젓는 등의 외부 유인이 없다..
제너레이터와 yield (3) - 지연 계산 제너레이터와 yield (1) 제너레이터와 yield (2) - 피보나치, 무한급수 현재값만 필요한 경우에 제너레이터가 속도/메모리 사용 측면에서 유리하나 제너레이터를 사용하게 되면 수열의 다른 값을 참조할 수 없기에 (현재값만 사용하여 처리하는 알고리즘을 단일 패스 (single pass) 혹은 온라인 (online) 이라 합니다) 사용하기 까다로울 수 있습니다. 이때 활용할 수 있는 모듈이 바로 itertools 입니다. itertools 모듈 이번 포스트에서는 파이썬의 itertools 내장 모듈에 대해 알아보려고 합니다. itertools는 효율적인 반복을 위한 반복기 빌딩 블록을 generator를 이용한 iterator 형태로 구성하여 빠르고 효율적으로 메 hongl.tistory.com 대용..
제너레이터와 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$를 계산하는 코드에 대해서만 역어셈플 결과를 살펴보면 다음과 같습니다. >>>..

반응형