Python のモジュールをCで描く。内積
すべてを理解しているわけではないので、とりあえずコードを載せときます。「納得!!」と思ったらまとめる予定。
cal_dot.c
#include <Python.h> static PyObject* dot(PyObject* list1,PyObject* list2) { long size1=PyList_Size(list1); long size2=PyList_Size(list2); double temp,out_sum=0; long i; if(size1!=size2){ return NULL; } for(i=0;i<size1;i++){ temp=PyFloat_AsDouble(PyList_GetItem(list1,i))*PyFloat_AsDouble(PyList_GetItem(list2,i)); out_sum+=temp; } return PyFloat_FromDouble(out_sum); } static PyObject* wrap_dot(PyObject* self,PyObject* args) { PyObject *list1,*list2; if(!PyArg_ParseTuple(args,"OO", &list1, &list2 )){ return NULL; } return dot(list1,list2); } static PyMethodDef dotmethods[]={ {"dot",wrap_dot,METH_VARARGS}, {NULL}, }; void initdot(){ Py_InitModule("dot",dotmethods); }
setup.py(gcc でbuild)
#! /usr/enb/bin python from distutils.core import setup,Extension from distutils.command import build_py, build_ext from distutils.errors import DistutilsPlatformError from distutils.unixccompiler import UnixCCompiler module1=Extension("dotmodule",["cal_dot.c"]) setup(name='dot,module',version='1.0', description='calculate dot', ext_modules=[module1])
$python setup.py build
buildのlibというディレクトリの中にdotmodule.soがあるのでPYTHONPATHを通す。
In [1]: import dot In [2]: a=[1,2,3] In [3]: dot.dot(a,a) Out[3]: 14.0