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

回答編集履歴

1

edit

2018/07/25 21:57

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -12,4 +12,84 @@
12
12
 
13
13
  普通に並列処理させたら、普通に速くなりました。
14
14
 
15
- 「直したソースコード」が誤っていますが、実行すべきコードを実行できていますか?
15
+ 「直したソースコード」が誤っていますが、実行すべきコードを実行できていますか?
16
+
17
+ ---
18
+
19
+ 私の手元では以下のコードのuseCPUを変えると正常にスケールします。
20
+
21
+ ```python
22
+ import concurrent.futures
23
+ import numpy as np
24
+ import time
25
+
26
+ img = np.ones(shape=(500,5000,3))
27
+
28
+ def main():
29
+ useCPU = 4
30
+ step = int(len(img) / useCPU )
31
+ mulchProcess(useCPU=useCPU, step=step)
32
+
33
+ def changeToGray(number: int, length: int):
34
+ s = time.time()
35
+ endPioint = number + length if number + length < len(img) else len(img) - 1
36
+ part_height = img[number:endPioint-1]
37
+ for width in part_height:
38
+ for pixel in width:
39
+ gray = int(pixel[0]*0.3) + int(pixel[1]*0.59) + int(pixel[2]*0.11)
40
+ pixel[0] = gray
41
+ pixel[1] = gray
42
+ pixel[2] = gray
43
+ t = time.time() - s
44
+ return number, part_height, t
45
+
46
+ def mulchProcess(useCPU: int, step: int):
47
+ index_list = [i for i in range(0, len(img), step)]
48
+ with concurrent.futures.ProcessPoolExecutor(max_workers=useCPU) as executer:
49
+ fs = [executer.submit(changeToGray, i, step) for i in index_list]
50
+ for future in concurrent.futures.as_completed(fs):
51
+ line_number = future.result()[0]
52
+ part_height = future.result()[1]
53
+ t = future.result()[2]
54
+ print(t)
55
+ for i, height in zip(range(line_number, line_number+len(part_height)), part_height):
56
+ img[i] = height
57
+
58
+ s = time.time()
59
+ main()
60
+ print(time.time()-s)
61
+ ```
62
+
63
+ 時間は以下のようになります。
64
+ 手元のPCは4coreなので、8個使おうとしても一度に4つずつしか実行できません。
65
+ それらがキューに乗せられて順番に実行されるわけではなく、スイッチしながら実行されるので、プロセスあたり2倍の時間がかかり、結局全体の時間は同じになります。
66
+ むしろスイッチした分だけオーバーヘッドがあって全体の実行時間が長くなっています。
67
+ ```
68
+ useCPU = 1
69
+ 3.6020491123199463
70
+ total 4.26886773109436
71
+
72
+ useCPU = 2
73
+ 1.7662358283996582
74
+ 1.7804999351501465
75
+ total 2.166551113128662
76
+
77
+ useCPU = 4
78
+ 0.9876649379730225
79
+ 0.9972729682922363
80
+ 1.0097663402557373
81
+ 1.0141608715057373
82
+ total 1.2486088275909424
83
+
84
+ useCPU = 8
85
+ 0.9724259376525879
86
+ 0.9717621803283691
87
+ 0.973222017288208
88
+ 0.97617506980896
89
+ 0.9814469814300537
90
+ 0.9806389808654785
91
+ 0.9841761589050293
92
+ 0.9821760654449463
93
+ 0.015022039413452148
94
+ total 1.2429370880126953
95
+ ```