Python

· Python
컴파일링 최적의 알고리즘으로 처리할 데이터를 간소화했다면, 수행할 명령을 줄이는 방법으로 기계어로 컴파일하는 방법을 사용할 수 있다. 아래의 사진처럼 속도를 개선하는 작업을 할 때는 어느 정도 정해진 순서가 있다. 먼저 프로파일링을 통해 코드가 어떻게 동작하고, 어느 곳에서 병목이 일어나는지 이해하면 알고리즘 수준에서 속도를 향상시킬 수 있다. 하지만 개선을 진행할수록 알고리즘으로 할 수 있는 성능의 개선폭은 작아지므로 일정 수준 진행되었으면 컴파일을 통해 추가로 성능을 높일 수 있다. 컴파일링으로 성능을 높일 수 있는 이유 파이썬은 동적 타입 언어이기 때문에 항상 함수의 인자를 사용하기 전 해당 인자의 타입을 살펴보고 판단한다. 이런 호출 횟수가 많을 수록 오버헤드는 증가하기에 파이썬이 느리게 동작하는..
· Python
이전 포스트에 이어 numpy와 관련된 더욱 빠른 연산을 위해 사용할 수 있는 도구들과 이들에 대한 비교를 해보자. numexpr numpy는 A * B + C와 같은 연산을 하면 먼저 A * B의 결과를 임시 벡터에 저장한 다음 C를 더한다. 하지만 numexpr 모듈은 계산에 사용한 전체 벡터를 취합해서 캐시 미스와 임시 벡터 사용을 최소화하는 아주 효율적인 코드로 컴파일한다. 또한 멀티 코어를 사용하면 이를 활용할 수 있도록 최적화하고 연산을 병렬화해주는 OpenMP도 지원한다. numexpr은 변수를 사용한 식을 단순히 문자열로 표현하기만 하면 된다. from numexpr import evaluate def evolve(grid, dt, next_grid, D=1): laplacian(grid,..
· Python
다룰 내용 벡터 연산 병목 지점의 위치 계산 과정 중에 CPU를 효율적으로 사용하는지 알아볼 수 있는 도구 - perf 산술 계산에서 numpy가 순수 파이썬보다 더 빠른 이유 - 메모리 단편화와 메모리 지역성 캐시 미스와 페이지 폴트 코드 내에서 메모리 할당을 추적하는 방법 여러개의 연산을 한번에 수행할 수 있는 벡터 연산은 프로그램을 빠르게 실행하기 위한 필수 불가결한 요소이다. 이번장에서는 확산 방정식을 연산하는 동안에 CPU의 동작 과정을 이해함으로써 벡터 연산에 대해 알아보고 numpy가 어떻게 돌아가는지, numpy위에 구축된 pandas를 더 빠르게 실행할 수 있는 방법은 무엇인지 알아본다. 예제에서 사용한 확산 방정식 더보기 이부분은 사실 예제에서 사용하는 확산 방정식을 설명하는 부분으로 ..
· Python
이전 포스트에서 한 컴퓨터 내에서 NSQ를 사용하는 방법에 대해 다뤘다. 하지만 NSQ를 사용하는 목적은 컴퓨터 한 대가 아닌 클러스터를 만들기 위함이고, NSQ의 장점 중 하나가 원격 클러스터링이라 했는데 책에서는 다루지 않아서 따로 알아보았다. 먼저 요약하자면 원격 클러스터 구축을 위해서는 원격 컴퓨팅 엔진, 포트 개방을 위한 포트포워딩, NSQ 설치가 필요하다. GCP Compute Engine 일단 여러 컴퓨터로 클러스터를 이루려면 현재 사용중인 맥북 외의 다른 컴퓨터가 있어야 한다. 하지만 없으므로 Google Cloud Platform, 줄여서 GCP에서 원격 클러스터링을 하는 방법을 생각했다. GCP는 90일간 300불 가량의 크레딧을 제공해서 무료로 원격 컴퓨팅 엔진을 사용해볼 수 있다. ..
· Python
강건한 프로덕션 클러스터링을 위한 NSQ 프로덕션 환경에서는 이전에 언급한 클러스터링 도구보다 훨씬 더 강건한 솔루션이 필요하다. 클러스터를 매일 운용하는 상황에서는 일부 노드를 사용할 수 없게 되거나, 코드가 오류로 중단되거나, 네트워크가 망가지거나, 그 외의 일어날 가능성이 있는 수천 가지 문제 중 어떤 일이 벌어질 것이기 때문이다. 이전의 도구들은 모두 명령을 내리는 컴퓨터가 한 대뿐이고, 그 명령을 읽어서 실행하는 컴퓨터가 미리 정해져 있다는 문제가 있다. 이보다는 여러 컴퓨터가 메시지 버스를 통해 서로 통신하는 시스템이 더 나을 것이다. 이렇게 하면 언제든 메시지를 만드는 컴퓨터와 메시지를 소비하는 컴퓨터를 임의로 변경할 수 있다. NSQ는 고성능 분산 메시징 플랫폼으로, GO 언어로 작성되었지..
· Python
클러스터 이전 Multiprocessing에서는 한 개의 컴퓨터 내에서 멀티 코어를 병렬적으로 사용하는 방법에 대해 알아보았다. 이번 장에서는 여러 대의 컴퓨터를 하나로 모아서 쓰는 클러스터에 대해 알아본다. 일반적으로는 프로그램을 한 컴퓨터에 한정시키는게 유지보수 관점에서 편리하다. 하지만 제품이 정말 많은 CPU를 요구하거나 데이터를 디스크에서 가져와 병렬 처리하는 능력이 필요하거나 복원력이 높고 응답이 빨라야 한다면 클러스터로 옮기는 것이 좋을 수 있다. 장점 요구사항에 맞춰 시스템을 쉽게 키울 수 있다. ex) 단순히 컴퓨터(노드)를 추가/삭제하면 된다. 각기 다른 컴퓨터를 추가해서 신뢰성을 높일 수 있다. ex) 윈도우가 업데이트 할 때, 리눅스도 있으면 오류없이 계속 쓸 수 있다. 동적으로 규..
· Python
함수 호출 방식 함수에서 parameter를 전달하는 방식은 3가지가 있다. 값에 의한 호출 (Call by Value) 참조에 의한 호출 (Call by Reference) 객체 참조에 의한 호출 (Call by Object Reference) Call by Reference 함수에 인자를 넘길 때 메모리 주소를 넘긴다. 이렇게 되면 함수내에서 매개변수의 값을 변경하면 전달된 인자의 값도 변경된다. Call by Value 함수에 인자를 넘길 때 값만 넘긴다. 값만 넘기면 매개변수의 값을 변경해도 전달된 인자의 값은 변하지 않는다. 파이썬은 둘다 아니고 Call by Object Reference이다. 이를 알기 위해서는 Scope에 대해 알아야 한다. Scope Scope란 변수가 사용되는 범위이다...
· Python
삼항 연산자 value = 12 a = True if value % 2 == 0 else False if문이 맞으면 True를 틀리면 False를 사용하는 삼항 연산자이다. value는 12로 2로 나눈 나머지는 0이므로 a = True가 된다.
· Python
플랫폼 독립적인 인터프리터 언어 플랫폼 = OS 독립적인 = 관계없는, 상관없는 인터프리터 = 통역기를 사용하는 언어 즉, 파이썬은 OS에 상관없이 사용가능하고 소스코드를 바로 실행할 수 있는 언어이다. 컴파일러 VS 인터프리터 컴파일러는 소스코드를 기계어로 먼저 번역한 후 프로그램을 작동시키는데 이렇게 하면 OS에 최적화돼 프로그램을 실행하니까 실행속도가 빠르다. 반면, 인터프리터 언어는 소스코드를 실행하는 즉시 해석해 컴퓨터가 처리할 수 있게 한다. 그래서 실행속도가 느리다. 컴파일러 언어는 C, C++, C#, 자바 등이 있고 인터프리터 언어는 파이썬, 스칼라 등이 있다. 객체 지향 동적 타이핑 언어 객체 지향적 언어 : 객체를 중심으로 프로그램을 작성하는 언어 (실행 순서를 중심으로 작성하는 절차..
· Python
다룰 내용 제너레이터에서 메모리를 절약하는 법 제너레이터가 유용한 상황 복잡한 제너레이터 작업에 itertools를 사용하는 방법 지연 연산이 효과적인 경우와 그렇지 않은 경우 제너레이터 제너레이터는 필요할 때마다 값을 생성할 수 있는, 즉 지연 연산을 할 수 있는 함수이다. 간단히 return 대신 yield를 사용해 값을 반환하는 함수가 제너레이터이다. for i in range(n): do_work(i) 가장 쉽게 볼 수 있는 제너레이터는 range()로 미리 모든 항목을 만들지 않고 필요할 때마다 지연 연산을 해서 값을 불러온다. 고로 미리 만들 필요가 없어 시간도 오래 걸리지 않고 메모리도 많이 필요하지 않다. # 피보나치 리스트를 만드는 함수 def fibonacci_list(num_items..