본문 바로가기

반응형

Computer

(114)
Argparse nargs, const, default 인자 사용법 파이썬 파일 실행 시 원하는 인자를 커맨드라인 상에서 전달하기 위해 argparse 패키지를 많이 사용할 겁니다. 실제로 파이썬에서 처음 접하게 되는 내장 라이브러리 중 하나입니다만 argument를 추가할 때 사용하는 함수의 (add_argument 함수) type, default 인자 이외의 생소한 인자를 만나게 되면 항상 사용법을 검색하게 되는데, 저 같은 경우는 nargs/const/default 인자입니다. nargs 인자 nargs 인자는 Number of Arguments 의미를 가지며 말 그대로 해당 argument에 대해 몇 개의 value를 넣을 것인지를 정합니다. 구체적인 숫자를 넣어도 되고 쉘 스크립트에서 사용되는 wildcard 캐릭터도 사용법이 미리 정의되어 있습니다. CLI 상..
파이썬의 추상 클래스 (Abstract Class) 코드가 고도화되고 모듈화 되면서 클래스 상속을 이용하는 경우가 많습니다. 특히, 여러 메서드의 이름은 공유하지만 각 클래스 별로 기능을 다르게 구현해야 하는 경우도 많죠. 따라서 관련된 함수, 메서드를 하나의 단위로 묶어 응집성을 강화하고자 하는 방편으로 파이썬에서는 추상 클래스라는 기능을 제공합니다. "추상"이라는 말 그대로 디테일한 기능이 구현되어 있지 않지만 이 클래스를 상속해서 만드는 클래스들에 필수적으로 정의해야 할 변수, 메서드를 선언만 해놓은 것이죠. 파이썬에서는 abc (abstract base class) 라이브러리를 제공합니다. 먼저 모델의 이름과 사이즈를 선언해야 하는 추상 클래스를 선언하겠습니다. from abc import ABCMeta, abstractmethod class Mo..
Pandas 문자열 찾기 Pandas에서는 문자열 데이터 타입도 지원하다 보니 이름, 제품 식별자, 코드 등으로 문자열을 분석하는 전 처리하는 경우가 많습니다. 특히, 특정 열의 문자열에서 어떤 기호나 이름을 찾는 일이 빈번한데요, 보통 stip 함수로 문자열 공백을 지우고 find 함수로 관심 있는 패턴을 찾게 됩니다. 이런 작업을 할 수 있는 방법이 여러 가지인 만큼 더 효율적인 방법 또한 존재할 텐데요, 이번 포스트에서는 특정 열의 숫자에 숫자 9가 있다면 몇 번째에 위치하는지 알고 싶어 하는 예로 살펴보겠습니다. 지난 포스트의 사용한 예제를 이용해 임의의 실수를 문자열로 변환한 열을 생성합니다. 첫 번째 소수와 소수점을 제거하고 find 함수로 9의 위치를 찾습니다. 만약 9가 없다면 -1을 반환합니다. 여러 데이터 행에..
Pandas Series, DataFrame 이어 붙이기 여러 데이터 행에 함수 적용하기 Pandas를 사용하다보면 특정 함수를 여러 행에 적용하는 경우가 굉장히 많습니다. 일반적인 for 루프나 Pandas의 iterrows 이터레이터 등을 활용할 수 있지만 행이 굉장히 많은 경우에는 많이 느리게 hongl.tistory.com 지난 포스트에서는 여러 데이터 행에 대해 OLS 함수를 적용하는 여러 방법을 살펴 봤습니다. 이때 매 행마다 반복적으로 OLS를 적용하는 다음 코드를 보면 매번 Series를 만들지 않고 부분 결과의 리스트를 만든 다음에 마지막 단계에서 Series로 변환합니다. 매번 Series를 만들고 이어 붙여도 되지 않을까요? for row_idx in range(df.shape[0]): row = df.iloc[row_idx] m = ols..
여러 데이터 행에 함수 적용하기 Pandas를 사용하다보면 특정 함수를 여러 행에 적용하는 경우가 굉장히 많습니다. 일반적인 for 루프나 Pandas의 iterrows 이터레이터 등을 활용할 수 있지만 행이 굉장히 많은 경우에는 많이 느리게 됩니다. 어떤 방법이 제일 효율적일까요? 통신사의 예를 들어봅시다. 통신사에는 고객별로 일별 통화 사용량 정보가 있고 각 고객이 통화를 점점 더 많이 혹은 더 적게 하는지 알고 싶다고 합시다. 그렇다면 일반 최소 제곱 (OLS, Ordinary, Least Square) 방법을 적용해서 고객별 일별 통화 사용량 데이터에 직선을 맞추고 그 직선의 기울기를 통해 판단할 수 있겠죠. (고객별로 일차 추세선 함수를 만들면 됩니다) 이제 실험에 사용할 데이터를 만듭니다. 푸아송 분포를 이용해 데이터 만들기..
Numba (2) - 타입 컨테이너, 루프 퓨전 Numba (1) Numba 타입 컨테이너 Numba에서 가장 중요한 권장 사항은 최적의 컴파일을 제공하는 "nopython" 모드를 사용하는 것일 겁니다. (오브젝트 모드 (object mode)는 최소한의 최적화만 진행하게 됩니다) 이는 @jit 데코레이터에 "nopython=True" 옵션을 주거나 @njit 데코레이터를 사용하면 되는데요, 하지만 지난 포스트에서 살펴봤듯이 이 모드는 제한이 많아 컴파일이 성공하려면 Numba가 작상한 함수 내의 모든 변수 타입을 추론할 수 있어야 합니다. Numba는 튜플, 문자열, 이넘, 정수, 실수 등의 간단한 스칼라 타입과 넘파이 배열 데이터 타입을 지원하지만 대표적으로 리스트, 딕셔너리 아규먼트에 대해서는 동작하지 않습니다. 이는 파이썬 리스트나 딕셔너리는..
파이썬 코드 C언어로 컴파일하기 (3) - 사이썬과 넘파이 파이썬 코드 C언어로 컴파일하기 (1) 파이썬 코드 C언어로 컴파일하기 (2) 이 포스트에서 살펴봤듯이 파이선의 리스트 객체는 실제 데이터가 아니라 데이터가 저장된 주소를 담고 있기에 리스트 객체가 가리키는 객체는 메모리의 어디든 존재할 수 있습니다. 따라서 역참조에 따른 부가비용이 발생합니다. 하지만 배열 객체는 기본 타입을 연속적인 RAM 블록에 저장하므로 주소 계산이 빠르고 파이썬에서는 array 모듈로 기본 타입에 대한 1차원 저장소를 제공합니다. 넘파이의 array 모듈을 사용하면 다차원 배열을 지원하죠. 따라서 파이썬에서 다음 주소를 요청하지 않고 연속적인 메모리 공간에 놓인 배열 객체를 이용해 오프셋을 이용해 다음 메모리 주소를 직접 계산하도록 접근한다면 파이썬 가상 머신을 호출할 필요가 없..
파이썬 코드 C언어로 컴파일하기 (2) 파이썬 코드 C언어로 컴파일하기 (1) 지난 포스트에서 calculate_z 함수를 사이썬으로 빌드하여 속도 개선을 얻었지만 calculate_z 함수 내용을 아예 건드리지 않고 그대로 빌드했습니다. 그렇다면 무엇을 어떻게 변경하면 추가적인 속도 개선을 얻을 수 있을까요? C언어와 파이썬의 여러 차이점 중 하나는 C언어는 변수의 타입을 미리 지정하는 정적언어인데 반해 파이썬은 변수가 어떤 타입이라도 참조할 수 있고 코드 어디에서든 참조하는 객체의 타입을 변경할 수 있는 동적언어라는 점입니다. 따라서 순수 파이썬으로 작성된 코드는 동적언어라는 특징 때문에 가상 머신에서 다음 연산에 사용할 기본적인 데이터 타입을 알 수 없으므로 기계어 수준의 최적화를 수행하기 어렵습니다. 실행 속도 대신 개발 속도를 선택한..

반응형