質問するログイン新規登録

質問編集履歴

3

タイトル変更

2019/03/22 20:46

投稿

nonshi
nonshi

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- pythonコードをC++に埋め込みたい
1
+ pythonコードをC++に埋め込みたい(cythonを使って)
body CHANGED
File without changes

2

大幅な質問変更

2019/03/22 20:46

投稿

nonshi
nonshi

スコア17

title CHANGED
File without changes
body CHANGED
@@ -4,12 +4,9 @@
4
4
  なので一度改めてスレを立てて、もう一度挑戦したいと思います。
5
5
 
6
6
  では、本題へ
7
- 1.
8
- Pythonで書いコードをC++に埋め込みた
7
+ 実現したいことは
9
- 2.
10
- トスピードは100ms以内またはそれに近い速度を出したい。
11
8
 
12
- この2つコードを実現したいです。
9
+ Pythonで書いたコードC++に埋め込みいので、cythonを使ってpythonコードからcのコード生み出したいです。
13
10
  ### C++に埋め込みたいPythonコード
14
11
  変更点:scikit-learnには専用?の保存moduleがあったためこちらに変更
15
12
  ```python
@@ -31,74 +28,73 @@
31
28
  #予測結果を出す
32
29
  print(model.predict(X_test))
33
30
  ```
34
- ### 現在実現できている方法
31
+ ### cytest.pyx
35
- python.hを使ったC++からPython関数を呼ぶコード(これに関しては500msかかってしまい没)
36
- ```
37
- #include"pch.h"
38
- #include<stdio.h>
39
- #include<Python.h>
40
- #include<string>
41
- #include<iostream>
42
- #include <chrono>
43
- using namespace std;
44
32
 
45
- int main() {
33
+ joblib-ver-
46
- chrono::system_clock::time_point start, end; // 型は auto で可
34
+ ```pyx
47
- start = chrono::system_clock::now(); // 計測開始時間
35
+ from sklearn.externals import joblib
36
+ from libc.stdio cimport printf
37
+ cdef public struct Point:
38
+ double x
39
+ double y
48
40
 
49
- PyObject *pName, *pModule, *pTmp, *pFunc;
41
+ cdef public Point func(Point a,Point b):
42
+ cdef Point b
43
+ model = joblib.load('model.joblib')
44
+ X_test = [[a.x,b.y]]
45
+ b = model.predict(X_test)
46
+ printf("b=%f\n",b)
47
+ return b
48
+ ```
49
+ pickle-ver
50
+ ```pyx
51
+ from libc.stdio cimport printf
50
- int res_data;
52
+ import pickle
53
+ cdef public struct Point:
51
- int x = 345;
54
+ double x
52
- int y = 781;
55
+ double y
53
56
 
57
+ cdef public Point func(Point x1,Point y1):
54
- //最初に必ず入れる
58
+ cdef Point b
59
+ f = open("model.pkl", "rb")
55
- Py_Initialize();
60
+ model = pickle.load(f)
61
+ X_test = [[x1.x,y1.y]]
62
+ b = model.predict(X_test)
63
+ return b
64
+ ```
65
+ ###setup.py
66
+ ```python
67
+ from distutils.core import setup
68
+ from Cython.Build import cythonize
56
69
 
57
- //カレントディレクトリを探す範囲にいれる-------------------------
58
- PyObject *sys = PyImport_ImportModule("sys");
70
+ setup(ext_modules=cythonize("cytest.pyx"))
59
- PyObject *path = PyObject_GetAttrString(sys, "path");
60
- PyList_Append(path, PyUnicode_DecodeFSDefault("."));
71
+ ```
61
- //---------------------------------------------------------------
62
72
 
63
- //探すファイルを-------------------------------------------
73
+ ###動かC++プログラム
74
+ ```c++
64
- pName = PyUnicode_DecodeFSDefault("a");
75
+ #include <iostream>
76
+ #include<Python.h>
77
+ #include<stdio.h>
65
- pModule = PyImport_Import(pName);
78
+ #include "cytest.h"
66
- Py_DECREF(pName);
67
- //---------------------------------------------------------------
68
79
 
80
+ int main() {
81
+ Py_Initialize();
82
+ struct Point a;
83
+ struct Point b;
69
- //タプルの作成 -----------------------------------------------
84
+ a.x = 0.2346;
85
+ b.y = 0.0324;
70
- PyObject * pArgs = PyTuple_New(2);
86
+ struct Point b = func(a, b);
71
- PyObject * pValue1 = PyFloat_FromDouble(x);
72
- PyObject * pValue2 = PyFloat_FromDouble(y);
73
- PyTuple_SetItem(pArgs, 0, pValue1);
74
- PyTuple_SetItem(pArgs, 1, pValue2);
75
- //---------------------------------------------------------------
76
-
77
- if (pModule != NULL) {
78
-
79
- //pFuncに今回呼び出す関数を設定する(今回はfunc)
80
- pFunc = PyObject_GetAttrString(pModule, "func");
81
-
82
- //pFuncを引数を与える(pArgsはタプルでなければならない)
83
- pTmp = PyObject_CallObject(pFunc, pArgs);
84
-
85
- //関数を実行 d:double型を受け取る
86
- PyArg_Parse(pTmp, "i", &res_data);
87
- printf("%i\n", res_data);
87
+ printf("b=%f\n", b);
88
- }
89
- //最後に必ず入れる
90
88
  Py_Finalize();
91
- // 処理
92
- end = chrono::system_clock::now(); // 計測終了時間
93
- double elapsed = chrono::duration_cast<chrono::milliseconds>(end - start).count(); //処理に要した時間をミリ秒に変換
94
- cout << elapsed << endl;
95
-
96
- return 0;
97
89
  }
98
90
  ```
99
-
91
+ ###現在詰まっているところ
92
+ ![イメージ説明](a55128c14bae7949684dfd045d7854b3.png)
93
+ python setup.py build_ext --inplaceを実行すると、
94
+ となっておりpickleをimportすることによってできるpickle.loadでコンパイルできないよって言われている。(おそらく)
100
95
  ### 補足情報(FW/ツールのバージョンなど)
101
96
  windows10
102
97
  visual studio 2017
103
98
  python3.6.8
104
- model.joblib(107KB)
99
+ model.joblib(107KB)
100
+ model.pkl(502KB)

1

pickle-verーの追加

2019/03/22 20:44

投稿

nonshi
nonshi

スコア17

title CHANGED
File without changes
body CHANGED
@@ -20,6 +20,17 @@
20
20
  b = model.predict(X_test)
21
21
  return b
22
22
  ```
23
+ 一応前回のpickle-ver-
24
+ ```python
25
+ import pickle
26
+ #保存しているpklファイルを読み込む
27
+ with open("model.pkl", "rb") as f:
28
+ model = pickle.load(f)
29
+ #ここで予測したい値を入れる
30
+ X_test = [[0.0401541,0.155155]]
31
+ #予測結果を出す
32
+ print(model.predict(X_test))
33
+ ```
23
34
  ### 現在実現できている方法
24
35
  python.hを使ったC++からPython関数を呼ぶコード(これに関しては500msかかってしまい没)
25
36
  ```