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

swig

swigを使ってpythonモジュールを作ってみた。
環境はcygwinswigのバージョンは最新の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);
%}

Makefile

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言語は速い。