読者です 読者をやめる 読者になる 読者になる

Boost.Pythonに挑戦

// src/fibo.cpp
#include <boost/python.hpp>
int fibo(int n)
{
    if(n == 0) return 0;
    if(n == 1) return 1;
    return fibo(n - 1) + fibo(n - 2);
}
BOOST_PYTHON_MODULE(fibo)
{
    boost::python::def("fibo", fibo);
}
# SConstruct
from os import environ
from distutils.sysconfig import get_python_inc, get_python_lib

env = Environment(
    CPPFLAGS  = ['/O2', '/MD', '/EHsc'],
    CPPDEFINES = [ 'BOOST_PYTHON_STATIC_LIB' ],
    CPPPATH = [ environ['BOOST_INC'], get_python_inc() ],
    LIBPATH = [ environ['BOOST_LIB'], get_python_lib(standard_lib = True) + 's' ],
    SHLIBSUFFIX = '.pyd' )
env.VariantDir('.obj', 'src')

pyd = env.SharedLibrary('.obj/fibo.pyd', '.obj/fibo.cpp')
env.AddPostAction(pyd, Copy('.', pyd[0].abspath))
env.Clean(pyd, ['.obj', 'fibo.pyd'])
env.Default(pyd)

env.Command('test', pyd, 'python test.py')
  • BOOST_INC/BOOST_LIBはローカルに配置してあるboostへのパス。
# test.py
from fibo import *
print 'fibo(40) ->', fibo(40)
$ scons -Q test
cl /Fo.obj\fibo.obj /c .obj\fibo.cpp /TP /nologo /O2 /MD /EHsc /DBOOST_PYTHON_STATIC_LIB /IE:\usr\local\Boost\include\boost-1_41 /IE:\Python26\include
fibo.cpp
link /nologo /dll /out:.obj\fibo.pyd /implib:.obj\fibo.lib /LIBPATH:E:\usr\local\Boost\lib /LIBPATH:E:\Python26\Libs .obj\fibo.obj
   ライブラリ .obj\fibo.lib とオブジェクト .obj\fibo.exp を作成中
Copy(".", "C:\test\.obj\fibo.pyd")
python test.py
fibo(40) -> 102334155

Boost1.41.0+SConstruct+msvc9
swigよりも気持ち速いような気もする。気のせい?
関数だけだと面白くないのでクラスもやってみよう。そのうち。

今更ながら

[id:shive:20090820:1250747203]のフィボナッチ数列間違ってます。fibo(0)は1じゃなくて0。