おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

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