Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

C言語でPythonモジュール作成 ~part2~

C言語Pythonモジュールの続きになります!!
elsammit-beginnerblg.hatenablog.com


前回は誤ったソースを展開してしまいました。。。
C言語Pythonモジュールのバブルソートですが、出来ましたので報告!!
f:id:Elsammit:20200530194025j:plain

結論から申しますと、PyObjectとPyListObjectの扱いを誤っていたためでした(泣)。

C言語Pythonモジュールのバブルソートはこちらになります。

static PyObject* c_bubble(PyObject *self, PyObject *args){
    PyObject *receive_list,*buf;

    // 配列を抽出
    receive_list = args
    //receive_list = PySequence_List(args);

    for(int i=0;i<PyList_Size(receive_list);i++){
        for(int j=i+1;j<PyList_Size(receive_list);j++){
            if(PyLong_AsLong(PyList_GetItem(receive_list,j-1)) > 
               PyLong_AsLong(PyList_GetItem(receive_list,j))){
                *buf = receive_list[j-1];
                receive_list[j-1] = receive_list[j];
                receive_list[j] = *buf;
            }
        }
    }
    return receive_list;    // 配列を返却
}

自分が誤っていた点は2つ!!
 ①PyList_GetItem APIで返ってくる型はPyObjectであるため、整数型に変換するためにPyLong_AsLong APIが必要
 ②PyList型のオブジェクトから要素数を得るためにはPyList_Size APIを用いなければならない
誤っていたソースの時は渡されたPyList型のオブジェクト要素数によらず、4でループが回っておりました。。。
ちゃんと、仕様書を読め!!ということですね。。。
docs.python.org
docs.python.org

では、Pythonモジュール側のバブルソートの処理時間を要素数を変更しながら確認していきます。
結果は下記の通り。
f:id:Elsammit:20200531180851j:plain

モジュール化しても要素数10000だと5秒弱かかってしまいますが、pythonよりは断然早いですね!!