回答編集履歴
2
コメント追加
answer
CHANGED
@@ -17,6 +17,9 @@
|
|
17
17
|
lst
|
18
18
|
|
19
19
|
def f1(a,b,c,d):
|
20
|
+
"""私が考えた方式。一列ずつ見て、削っていきます
|
21
|
+
こうすると比較の回数がケチれて(本質的には短絡評価と同じことをしています)速いはずです
|
22
|
+
"""
|
20
23
|
tmp = A
|
21
24
|
for i, eqv in enumerate([a,b,c,d]):
|
22
25
|
tmp = tmp[tmp[:,i] == eqv]
|
1
質問者様の方式も追加
answer
CHANGED
@@ -6,9 +6,17 @@
|
|
6
6
|
|
7
7
|
A = np.arange(50000).reshape((10000, 5))
|
8
8
|
|
9
|
+
def f0(a,b,c,d):
|
10
|
+
"""質問文の方式
|
11
|
+
"""
|
12
|
+
lst = []
|
13
|
+
for i in A:
|
14
|
+
if i[0] == 1 and i[1] == 2 and i[2] == 3 and i[3] == 4:
|
15
|
+
lst.append(i[4])
|
16
|
+
# print(lst)
|
17
|
+
lst
|
18
|
+
|
9
19
|
def f1(a,b,c,d):
|
10
|
-
"""mkgreiさんの方式だと.all以前が律儀にすべて計算されて遅いと思ったので、こうしてみました
|
11
|
-
"""
|
12
20
|
tmp = A
|
13
21
|
for i, eqv in enumerate([a,b,c,d]):
|
14
22
|
tmp = tmp[tmp[:,i] == eqv]
|
@@ -23,6 +31,14 @@
|
|
23
31
|
# print(A[idx, -1])
|
24
32
|
A[idx, -1] # 計測時にprintしたくなかったので
|
25
33
|
|
34
|
+
print(timeit.timeit(lambda : f0(0,1,2,3), number=1000))
|
26
|
-
print(timeit.timeit(lambda : f1(0,1,2,3), number=1000))
|
35
|
+
print(timeit.timeit(lambda : f1(0,1,2,3), number=1000))
|
27
36
|
print(timeit.timeit(lambda : f2(0,1,2,3), number=1000))
|
37
|
+
"""
|
38
|
+
私の環境だと、
|
39
|
+
3.3318773460000557
|
40
|
+
0.06133379499988223
|
41
|
+
0.27946032499994544
|
42
|
+
くらい
|
43
|
+
"""
|
28
44
|
```
|