回答編集履歴

4

修正

2020/07/22 03:54

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -33,6 +33,18 @@
33
33
  * Core i7-6700K @ 4.00GHz (index が numpy): 27.5 ms
34
34
 
35
35
  * Core i7-6700K @ 4.00GHz (index が list): 442 ms
36
+
37
+
38
+
39
+ インデックスにリストを使うなど配列処理に Python のオブジェクトが混じってしまうと、Cで最適化された numpy のコードではなく、Python のコードを実行することになるので、かなり遅くなります。
40
+
41
+
42
+
43
+ おおよそ
44
+
45
+ * GPU は CPU より数十倍早い
46
+
47
+ * C言語は Python より100倍ぐらい早い
36
48
 
37
49
 
38
50
 

3

修正

2020/07/22 03:54

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -30,9 +30,9 @@
30
30
 
31
31
  * GTX 2080: 700 µs
32
32
 
33
- * CPU (index が numpy): 27.5 ms
33
+ * Core i7-6700K @ 4.00GHz (index が numpy): 27.5 ms
34
34
 
35
- * CPU (index が list): 442 ms
35
+ * Core i7-6700K @ 4.00GHz (index が list): 442 ms
36
36
 
37
37
 
38
38
 

2

修正

2020/07/22 03:48

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  サポートしています。
6
6
 
7
- 遅いのは、一旦 numpy に戻して処理しているからだと思います。
7
+ 遅いのは、一旦 numpy に戻した上に、インデックスが tolist() で Python のリストにして処理しているからだと思います。
8
8
 
9
9
 
10
10
 
@@ -30,9 +30,17 @@
30
30
 
31
31
  * GTX 2080: 700 µs
32
32
 
33
+ * CPU (index が numpy): 27.5 ms
34
+
35
+ * CPU (index が list): 442 ms
36
+
33
37
 
34
38
 
35
39
  [Python - コードの実行時間を計測する方法 - pystyle](https://pystyle.info/python-wall-time-measurement/)
40
+
41
+
42
+
43
+ ### Pytorch の計測コード
36
44
 
37
45
 
38
46
 
@@ -69,3 +77,79 @@
69
77
  # GTX 2080: 700 µs ± 68.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
70
78
 
71
79
  ```
80
+
81
+
82
+
83
+ ### CPU (index が numpy) の計測コード
84
+
85
+
86
+
87
+ ```
88
+
89
+ import numpy as np
90
+
91
+
92
+
93
+ N = 7000
94
+
95
+ M = 1500000
96
+
97
+
98
+
99
+ A = np.random.randn(N, N)
100
+
101
+ I = np.random.randint(0, N, size=M)
102
+
103
+ J = np.random.randint(0, N, size=M)
104
+
105
+
106
+
107
+ print(A.shape, I.shape, J.shape)
108
+
109
+ # torch.Size([7000, 7000]) torch.Size([1500000]) torch.Size([1500000])
110
+
111
+
112
+
113
+ %timeit -n100 A[I, J]
114
+
115
+ # 27.5 ms ± 57.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
116
+
117
+ ```
118
+
119
+
120
+
121
+ ### CPU (index が list) の計測コード
122
+
123
+
124
+
125
+ ```python
126
+
127
+ import numpy as np
128
+
129
+
130
+
131
+ N = 7000
132
+
133
+ M = 1500000
134
+
135
+
136
+
137
+ A = np.random.randn(N, N)
138
+
139
+ I = np.random.randint(0, N, size=M).tolist()
140
+
141
+ J = np.random.randint(0, N, size=M).tolist()
142
+
143
+
144
+
145
+ print(A.shape, len(I), len(J))
146
+
147
+ # torch.Size([7000, 7000]) torch.Size([1500000]) torch.Size([1500000])
148
+
149
+
150
+
151
+ %timeit -n1 A[I, J]
152
+
153
+ # 442 ms ± 2.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
154
+
155
+ ```

1

修正

2020/07/22 03:46

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -48,11 +48,11 @@
48
48
 
49
49
 
50
50
 
51
- A = torch.randn(N, N, device="cuda:1")
51
+ A = torch.randn(N, N, device="cuda")
52
52
 
53
- I = torch.randint(high=N, size=(M,), device="cuda:1")
53
+ I = torch.randint(high=N, size=(M,), device="cuda")
54
54
 
55
- J = torch.randint(high=N, size=(M,), device="cuda:1")
55
+ J = torch.randint(high=N, size=(M,), device="cuda")
56
56
 
57
57
 
58
58