swig
swigを使ってpythonモジュールを作ってみた。
環境はcygwinでswigのバージョンは最新の1.3.40。
example.c
const char aaa[] = "on the c"; int fibo(int n) { return (n < 2)? 1: (fibo(n - 2) + fibo(n - 1)); }
example.i
%module example %inline %{ extern const char aaa[]; extern int fibo(int n); %}
PYTHON_DIR=f:/Python26 PYTHON=$(PYTHON_DIR)/python.exe CFLAGS=-mno-cygwin -O2 -I$(PYTHON_DIR)/include -L$(PYTHON_DIR)/libs SWIG=../../python/swigwin-1.3.40/swig.exe NAME=example TARGET=_$(NAME).pyd $(TARGET): $(NAME).o $(NAME)_wrap.o gcc $(CFLAGS) -mdll -o $@ $? -lpython26 $(NAME)_wrap.c: $(NAME).i $(SWIG) -python $(NAME).i test: $(TARGET) $(PYTHON) $(NAME)_test.py clean: rm -vf *.o *.pyc $(TARGET) $(NAME).py $(NAME)_wrap.c
example_test.py テスト
import example print "aaa =", example.cvar.aaa print "fibo(40) =", example.fibo(40)
ビルド&テスト
$ make cc -mno-cygwin -O2 -If:/Python26/include -Lf:/Python26/libs -c -o example.o example.c ../../python/swigwin-1.3.40/swig.exe -python example.i cc -mno-cygwin -O2 -If:/Python26/include -Lf:/Python26/libs -c -o example_wrap.o example_wrap.c gcc -mno-cygwin -O2 -If:/Python26/include -Lf:/Python26/libs -mdll -o _example.pyd example.o example_wrap.o -lpython26 $ time make test f:/Python26/python.exe example_test.py aaa = on the c fibo(40) = 165580141 real 0m2.719s user 0m0.061s sys 0m0.031s
こんな感じ。
fibo(40)が3秒未満!やはりC言語は速い。