Boost.Python을 이용한 python extension
파이썬은 단시간에 손쉽게 코드를 완성할 수 있어서, 새로운 아이디어를 구현해서 테스트해보기에 적합한 언어이다. 아이디어를 구현하는 초기에는 파이썬을 이용한 코딩이 많은 시간을 절약시켜 준다. 하지만 대용량의 데이터를 이용한 프로그램 검증이나 최적 파라미터를 찾는 등의 작업을 하기에는, 프로그램 수행속도가 느리다는 점에서 손해를 감수해야한다.
이런 문제를 해결할 수 있도록 low-level 언어인 C/C++를 이용해서 파이썬 인터페이스를 확장할 수 있다. Boost.Python은 이 확장 작업을 손쉽게 할 수 있도록 도와주는 라이브러리이다.
이후에 다시 참고하기 편하도록, 여기(http://radiohead.springnote.com/pages/712895)에서 정리한 내용을 다시 정리해본다.
Boost.Python으로 alignment를 구현해보았는데 python에서 C++로 대체된 부분에 대해서 수행시간이 획기적으로 개선되었다. 특히 다른 방법들과 비교했을 때, Boost.Python은 파이썬과 비슷한 스타일로 코딩을 할 수 있다는 점이 마음에 든다.
python profiler를 이용해서 파이썬 코드의 수행시간을 분석하고, 많은 시간이 소용되는 부분에 Boost.Python을 적용하면 효과적으로 코드를 최적화할 수 있을 것이다.
이런 문제를 해결할 수 있도록 low-level 언어인 C/C++를 이용해서 파이썬 인터페이스를 확장할 수 있다. Boost.Python은 이 확장 작업을 손쉽게 할 수 있도록 도와주는 라이브러리이다.
이후에 다시 참고하기 편하도록, 여기(http://radiohead.springnote.com/pages/712895)에서 정리한 내용을 다시 정리해본다.
- Boost.Python 설치
우분투에서 다음 명령어를 이용해서 Boost.Python을 설치할 수 있다.$ apt-get install libboost-python-dev libboost-python1.34.1
또는, http://www.boost.org/에서 Boost Jam과 Boost library를 다운로드 받은 후에 bjam을 이용해서 설치하는 방법이 있다.$ bjam --prefix=$HOME --with-python install--with-python 옵션을 같이 주면 Boost.Python이 설치된다. configure 명령어를 사용할 때와 마찬가지로 --prefix를 사용해서 설치위치를 지정할 수 있다. - 간단한 예제 모듈
간단한 문자열을 출력하는 예제 코드이다.// greet.cpp
//
#include <stdexcept>
char const* greet(unsigned x) {
static char const* const msgs[] = { "hello", "Boost.Python", "world!" };
if (x > 2)
throw std::range_error("greet: index out of range");
return msgs[x];
}
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(hello) {
def("greet", greet, "return one of 3 parts of a greeting");
}
위의 C++ 코드를 파이썬 모듈로 작성하기 위한 setup.py를 아래와 같이 만든다.from distutils.core import setup, Extension
module1 = Extension('hello',
include_dirs = ['/usr/include/boost'],
libraries = ['boost_python'],
library_dirs = ['/usr/lib'],
sources = ['greet.cpp'])
setup (name = 'hello',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1]) - 파이썬 인터프리터에서 예제 모듈 사용하기
아래 명령어로 예제 코드를 빌드한다.python setup.py build
빌드가 완료되면 현재 디렉토리 아래에 build/lib.linux-XXX에 hello.so가 생긴다. 이제 hello 모듈을 import해서 실행시켜 보자.>>> import sys
>>> sys.path.append('build/lib.linux-XXX')
>>> import hello
>>> for x in range(3): print hello.greet(x)
hello
Boost.Python
world!
Boost.Python으로 alignment를 구현해보았는데 python에서 C++로 대체된 부분에 대해서 수행시간이 획기적으로 개선되었다. 특히 다른 방법들과 비교했을 때, Boost.Python은 파이썬과 비슷한 스타일로 코딩을 할 수 있다는 점이 마음에 든다.
python profiler를 이용해서 파이썬 코드의 수행시간을 분석하고, 많은 시간이 소용되는 부분에 Boost.Python을 적용하면 효과적으로 코드를 최적화할 수 있을 것이다.
