回答編集履歴

3

修正

2021/12/11 07:27

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -5,3 +5,141 @@
5
5
 
6
6
 
7
7
  [Python - concurrent.futures を使った並列化の方法について](https://pystyle.info/python-concurrent-futures/)
8
+
9
+
10
+
11
+ ## 追記
12
+
13
+
14
+
15
+ ProcessPoolExecutor を使う場合、並列実行させる関数を関数内に定義するのはダメみたいです。外側に定義しましょう。
16
+
17
+
18
+
19
+ NG
20
+
21
+ ```python
22
+
23
+ def GraForestCl_predict_data(self):
24
+
25
+ def func():
26
+
27
+ ...
28
+
29
+ ```
30
+
31
+
32
+
33
+ OK
34
+
35
+ ```
36
+
37
+ def GraForestCl_predict_data(self):
38
+
39
+ ...
40
+
41
+
42
+
43
+ def func(self):
44
+
45
+ ...
46
+
47
+ ```
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ ----
56
+
57
+
58
+
59
+ ```python
60
+
61
+ import concurrent.futures
62
+
63
+
64
+
65
+ from sklearn.datasets import make_hastie_10_2
66
+
67
+ from sklearn.ensemble import GradientBoostingClassifier
68
+
69
+
70
+
71
+
72
+
73
+ class PredictData:
74
+
75
+ def __init__(self, X_train_trans, X_test_trans, y_train, y_test):
76
+
77
+ self.X_train_trans = X_train_trans
78
+
79
+ self.X_test_trans = X_test_trans
80
+
81
+ self.y_train = y_train
82
+
83
+ self.y_test = y_test
84
+
85
+
86
+
87
+ def forcount(self):
88
+
89
+ # この中身は適宜編集してください。以下はテスト用のコードです。
90
+
91
+ clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1).fit(
92
+
93
+ X_train, y_train
94
+
95
+ )
96
+
97
+ score = clf.score(X_test, y_test)
98
+
99
+
100
+
101
+ return score
102
+
103
+
104
+
105
+ def GraForestCl_predict_data(self):
106
+
107
+ num_tasks = 2 # タスクの合計数
108
+
109
+ num_workers = 8 # 並列実行数
110
+
111
+
112
+
113
+ with concurrent.futures.ProcessPoolExecutor(num_workers) as executor:
114
+
115
+ # タスクをプロセスプールに追加する。
116
+
117
+ futures = [executor.submit(self.forcount) for i in range(num_tasks)]
118
+
119
+
120
+
121
+ # 実行の完了を待機し、結果を取得する。
122
+
123
+ results = [x.result() for x in futures]
124
+
125
+ print(results)
126
+
127
+
128
+
129
+
130
+
131
+ # データセットを作成する。
132
+
133
+ X, y = make_hastie_10_2(random_state=0)
134
+
135
+ X_train, X_test = X[:2000], X[2000:]
136
+
137
+ y_train, y_test = y[:2000], y[2000:]
138
+
139
+
140
+
141
+ prd = PredictData(X_train, X_test, y_train, y_test)
142
+
143
+ prd.GraForestCl_predict_data()
144
+
145
+ ```

2

d

2021/12/11 07:27

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,6 +1,6 @@
1
1
  `executor.submit(forcount,i)` は実行する関数を追加したあと、ただちに終了するので、すべての実行の完了を待機するのは、`concurrent.futures.as_completed(futures)` の部分になります。
2
2
 
3
- そのため、「本来なら「開始」と「途中」の間に「start」が2個表示されるはず」とはなりませんが、並列実行されています。
3
+ そのため、質問に記載されている「本来なら「開始」と「途中」の間に「start」が2個表示されるはず」とはなりませんが、並列実行されています。
4
4
 
5
5
 
6
6
 

1

2021/12/08 11:38

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,3 +1,7 @@
1
1
  `executor.submit(forcount,i)` は実行する関数を追加したあと、ただちに終了するので、すべての実行の完了を待機するのは、`concurrent.futures.as_completed(futures)` の部分になります。
2
2
 
3
3
  そのため、「本来なら「開始」と「途中」の間に「start」が2個表示されるはず」とはなりませんが、並列実行されています。
4
+
5
+
6
+
7
+ [Python - concurrent.futures を使った並列化の方法について](https://pystyle.info/python-concurrent-futures/)