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

回答編集履歴

2

更に高速化案を提示

2019/05/23 03:19

投稿

hiro-k
hiro-k

スコア902

answer CHANGED
@@ -52,4 +52,25 @@
52
52
  for j in range (1,5):
53
53
  zj.append(zj[-1]*z)
54
54
  ```
55
+ と修正したところ、0.40384秒にまで速くなりました。更に yi[i] と zj[j] の掛け算も2回行うのはもったいないため、
56
+ ```python
57
+ p = x[a] * yi[i] * zj[j]
58
+ q = x[a + 25] * yi[i] * zj[j]
59
+ ```
60
+
61
+ ```python
62
+ yizj=yi[i]*zj[j]
63
+ p = x[a] * yizj
64
+ q = x[a + 25] * yizj
65
+ ```
66
+ とすると、0.3625秒になりました。ただしこの変更は計算の順番が変わるため、二つの結果の間には若干の計算誤差が有るかもしれません。更に、
67
+ ```python
68
+ b = b + p
69
+ c = c + q
70
+ ```
71
+
72
+ ```python
73
+ b += p
74
+ c += q
75
+ ```
55
- 修正したころ、0.40384秒にまで速くなりました。
76
+ 書くと、0.33198秒になりました。

1

更に高速な案を提示

2019/05/23 03:19

投稿

hiro-k
hiro-k

スコア902

answer CHANGED
@@ -36,4 +36,20 @@
36
36
 
37
37
  print('time : ' + str(round((t.time() - start),5)) + ' [sec]')
38
38
  ```
39
- とすると、手元の環境で 3.81263秒→ 0.70095秒と約5.4倍に速くなりました。
39
+ とすると、手元の環境で 3.81263秒→ 0.70095秒と約5.4倍に速くなりました。
40
+
41
+ 更に、べき乗をそれぞれ別々に求めるのも時間の無駄なので、
42
+ ```python
43
+ yi=[y**i for i in range(5)]
44
+ zj=[z**j for j in range(5)]
45
+ ```
46
+
47
+ ```python
48
+ yi=[np.ones_like(y)]
49
+ for i in range (1,5):
50
+ yi.append(yi[-1]*y)
51
+ zj=[np.ones_like(z)]
52
+ for j in range (1,5):
53
+ zj.append(zj[-1]*z)
54
+ ```
55
+ と修正したところ、0.40384秒にまで速くなりました。