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よりも気持ち速いような気もする。気のせい?
関数だけだと面白くないのでクラスもやってみよう。そのうち。