回答編集履歴

2

修正

2018/04/15 12:17

投稿

tachikoma
tachikoma

スコア3601

test CHANGED
@@ -58,6 +58,22 @@
58
58
 
59
59
  ```
60
60
 
61
+
62
+
63
+ In [51]: slen = 1000
64
+
65
+ ...: tslen = 1200
66
+
67
+ ...: N = 1000
68
+
69
+ ...:
70
+
71
+ ...: random.seed(0)
72
+
73
+ ...: s_org = [1]*(tslen-slen) + [random.randint(0, 1) for _ in range(1000)]
74
+
75
+ ...:
76
+
61
77
  In [52]: with timer("numpy"):
62
78
 
63
79
  ...: a = np.array(s_org)
@@ -78,4 +94,6 @@
78
94
 
79
95
  [numpy] done in 0.00026 s
80
96
 
97
+ In [53]: assert len11 == 202
98
+
81
99
  ```

1

追記

2018/04/15 12:17

投稿

tachikoma
tachikoma

スコア3601

test CHANGED
@@ -35,3 +35,47 @@
35
35
 
36
36
 
37
37
  pythonのfor-loopが遅いので行列のインデックスを駆使した方法です。理解してコーディングしないと収拾がつかなくなるので、適度な用法用量を守ってご参考にしてください。
38
+
39
+
40
+
41
+ ----
42
+
43
+ 追記
44
+
45
+
46
+
47
+ mkgreyさんのコードそのまま回したケース
48
+
49
+ [groupby] done in 0.39933 s
50
+
51
+ [forward-search] done in 0.12787 s
52
+
53
+ [backward-search] done in 0.05486 s
54
+
55
+
56
+
57
+ 最大の長さを返すよう若干修正したバージョン
58
+
59
+ ```
60
+
61
+ In [52]: with timer("numpy"):
62
+
63
+ ...: a = np.array(s_org)
64
+
65
+ ...: offset = 1
66
+
67
+ ...: diff_a = a[1:] - a[:-1]
68
+
69
+ ...: pos1to0 = np.where(diff_a ==-1)[0] + offset
70
+
71
+ ...: pos0to1 = np.where(diff_a ==+1)[0] + offset
72
+
73
+ ...: pos0to1 = np.append([0], pos0to1)
74
+
75
+ ...: len11 = (pos1to0 - pos0to1).max()
76
+
77
+ ...:
78
+
79
+ [numpy] done in 0.00026 s
80
+
81
+ ```