質問編集履歴

17

ソースコード修正

2019/05/05 15:33

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -33,8 +33,6 @@
33
33
  import numpy as np
34
34
 
35
35
  import time as t
36
-
37
- import sys
38
36
 
39
37
 
40
38
 

16

ソースコード修正

2019/05/05 15:32

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -29,6 +29,8 @@
29
29
 
30
30
 
31
31
  ```python
32
+
33
+ import numpy as np
32
34
 
33
35
  import time as t
34
36
 

15

文章修正

2019/05/05 15:30

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,3 @@
1
- ※丸投げというご指摘があり、質問を大幅に見直しました。失礼いたしました。
2
-
3
-
4
-
5
1
  **質問内容**
6
2
 
7
3
  python3で作成した内積を計算するプログラムの高速化を検討しております。

14

タイトル修正

2019/04/26 01:57

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
@@ -1 +1 @@
1
- ソースコード高速化できますでしょうか?
1
+ 内積計算のコード高速化
test CHANGED
File without changes

13

試したことを追記

2019/04/26 01:56

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -14,23 +14,19 @@
14
14
 
15
15
 
16
16
 
17
- ロジック修正により5倍ほど処理時間は速くなりましたが、
17
+ ロジック修正により5倍ほど処理時間は速くなりましたが、さらに速くしたいと考えております。
18
18
 
19
- さら速くしたい考えております。
19
+ ロジック修正後では、特以下のループの部分がボトルネックなっております。
20
20
 
21
21
 
22
-
23
- ロジック修正後では、以下のループの部分がボトルネックとなっております。
24
-
25
-
26
-
27
- p0 = [p0[:, i, :] for i in range(100000)]
28
22
 
29
23
  dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
30
24
 
31
25
 
32
26
 
33
- この部分を高速化することは可能でしょうか?
27
+ こは内積を計算する部分です。この部分を高速化することは可能でしょうか?
28
+
29
+ なお、試しにCythonでやってみましたが、エラーが出力されました。Cythonではlamdaはサポートされていないかもしれません。
34
30
 
35
31
  大変お手数ですが、ご回答頂けると助かります。
36
32
 

12

文章修正

2019/04/26 01:49

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ※丸投げというご指摘があり、質問を大幅に見直しました。大変申訳ございせん
1
+ ※丸投げというご指摘があり、質問を大幅に見直しました。失礼いたしました
2
2
 
3
3
 
4
4
 

11

文章修正

2019/04/25 08:45

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,10 @@
1
- ※丸投げというご指摘があり、質問を大幅に見直しました。大変申し訳ございませんでした
1
+ ※丸投げというご指摘があり、質問を大幅に見直しました。大変申し訳ございません。
2
2
 
3
3
 
4
4
 
5
5
  **質問内容**
6
6
 
7
- pythonで作成した内積を計算するプログラムの高速化を検討しております。
7
+ python3で作成した内積を計算するプログラムの高速化を検討しております。
8
8
 
9
9
  はじめはfor文を使用しておりましたので、for文を使わないようにロジックをみなおしました。
10
10
 
@@ -20,15 +20,17 @@
20
20
 
21
21
 
22
22
 
23
- ロジック修正後では、特に以下の部分がボトルネックとなっております。
23
+ ロジック修正後では、以下のループの部分がボトルネックとなっております。
24
24
 
25
25
 
26
+
27
+ p0 = [p0[:, i, :] for i in range(100000)]
26
28
 
27
29
  dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
28
30
 
29
31
 
30
32
 
31
- この部分を高速化することは可能でしょうか?
33
+ この部分を高速化することは可能でしょうか?
32
34
 
33
35
  大変お手数ですが、ご回答頂けると助かります。
34
36
 
@@ -36,9 +38,9 @@
36
38
 
37
39
  ```python
38
40
 
39
- import numpy as np
41
+ import time as t
40
42
 
41
- import time as t
43
+ import sys
42
44
 
43
45
 
44
46
 
@@ -56,9 +58,13 @@
56
58
 
57
59
  print('===== ロジック修正前 START =====')
58
60
 
61
+
62
+
59
63
  start1 = t.time()
60
64
 
61
65
  for i in range(100000):
66
+
67
+
62
68
 
63
69
  x = np.array(xyz[:, i, 0])
64
70
 
@@ -66,7 +72,11 @@
66
72
 
67
73
  z = np.array(xyz[:, i, 2])
68
74
 
75
+
76
+
69
77
  cvec = vec[:, i]
78
+
79
+
70
80
 
71
81
  p0 = np.array([x, y, z])
72
82
 
@@ -74,17 +84,25 @@
74
84
 
75
85
  d_vec = p0 - np.repeat(p_ref, 4).reshape(3, 4)
76
86
 
87
+
88
+
77
89
  dat0 = np.dot(cvec, d_vec)
90
+
91
+
78
92
 
79
93
  print('time : ' + str(round((t.time() - start1),5)) + ' [sec]')
80
94
 
81
- print('===== ロジック修正前 END =====')
95
+ print('===== ロジック修正前ソース END =====')
82
96
 
83
97
 
84
98
 
85
- print('===== ロジック修正後 START =====')
99
+ print('===== ロジック修正後ソース START =====')
100
+
101
+
86
102
 
87
103
  start2 = t.time()
104
+
105
+
88
106
 
89
107
  x = np.array(xyz[:, :, 0])
90
108
 
@@ -92,7 +110,11 @@
92
110
 
93
111
  z = np.array(xyz[:, :, 2])
94
112
 
113
+
114
+
95
115
  cvec = vec[:, :]
116
+
117
+
96
118
 
97
119
  p0 = np.array([x.T, y.T, z.T])
98
120
 
@@ -104,9 +126,11 @@
104
126
 
105
127
  dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
106
128
 
129
+
130
+
107
131
  print('time : ' + str(round((t.time() - start2),5)) + ' [sec]')
108
132
 
109
- print('===== ロジック修正後 END =====')
133
+ print('===== ロジック修正後ソース END =====')
110
134
 
111
135
 
112
136
 

10

文章修正

2019/04/25 02:19

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -20,17 +20,15 @@
20
20
 
21
21
 
22
22
 
23
- ロジック修正後では、以下のループの部分がボトルネックとなっております。
23
+ ロジック修正後では、特に以下の部分がボトルネックとなっております。
24
24
 
25
25
 
26
-
27
- p0 = [p0[:, i, :] for i in range(100000)]
28
26
 
29
27
  dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
30
28
 
31
29
 
32
30
 
33
- この部分を高速化することは可能でしょうか?
31
+ この部分を高速化することは可能でしょうか?
34
32
 
35
33
  大変お手数ですが、ご回答頂けると助かります。
36
34
 

9

タイトル編集

2019/04/24 14:14

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
@@ -1 +1 @@
1
- 【python】 このソースコードを高速化できますでしょうか?
1
+ このソースコードを高速化できますでしょうか?
test CHANGED
File without changes

8

ソース微修正

2019/04/24 13:43

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
@@ -1 +1 @@
1
- python このソースコードを高速化できますでしょうか?
1
+ python このソースコードを高速化できますでしょうか?
test CHANGED
File without changes

7

ソース微調整

2019/04/24 13:26

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
@@ -1 +1 @@
1
- python3 高速化 ロジックの修正
1
+ python このソースコードを高速化できますでしょうか?
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **質問内容**
6
6
 
7
- python3で作成した内積を計算するプログラムの高速化を検討しております。
7
+ pythonで作成した内積を計算するプログラムの高速化を検討しております。
8
8
 
9
9
  はじめはfor文を使用しておりましたので、for文を使わないようにロジックをみなおしました。
10
10
 

6

ソース微修正

2019/04/24 13:25

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -80,11 +80,11 @@
80
80
 
81
81
  print('time : ' + str(round((t.time() - start1),5)) + ' [sec]')
82
82
 
83
- print('===== ロジック修正前ソース END =====')
83
+ print('===== ロジック修正前 END =====')
84
84
 
85
85
 
86
86
 
87
- print('===== ロジック修正後ソース START =====')
87
+ print('===== ロジック修正後 START =====')
88
88
 
89
89
  start2 = t.time()
90
90
 
@@ -108,7 +108,7 @@
108
108
 
109
109
  print('time : ' + str(round((t.time() - start2),5)) + ' [sec]')
110
110
 
111
- print('===== ロジック修正後ソース END =====')
111
+ print('===== ロジック修正後 END =====')
112
112
 
113
113
 
114
114
 

5

ソース微修正

2019/04/24 13:22

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -58,13 +58,9 @@
58
58
 
59
59
  print('===== ロジック修正前 START =====')
60
60
 
61
-
62
-
63
61
  start1 = t.time()
64
62
 
65
63
  for i in range(100000):
66
-
67
-
68
64
 
69
65
  x = np.array(xyz[:, i, 0])
70
66
 
@@ -72,11 +68,7 @@
72
68
 
73
69
  z = np.array(xyz[:, i, 2])
74
70
 
75
-
76
-
77
71
  cvec = vec[:, i]
78
-
79
-
80
72
 
81
73
  p0 = np.array([x, y, z])
82
74
 
@@ -84,11 +76,7 @@
84
76
 
85
77
  d_vec = p0 - np.repeat(p_ref, 4).reshape(3, 4)
86
78
 
87
-
88
-
89
79
  dat0 = np.dot(cvec, d_vec)
90
-
91
-
92
80
 
93
81
  print('time : ' + str(round((t.time() - start1),5)) + ' [sec]')
94
82
 
@@ -98,11 +86,7 @@
98
86
 
99
87
  print('===== ロジック修正後ソース START =====')
100
88
 
101
-
102
-
103
89
  start2 = t.time()
104
-
105
-
106
90
 
107
91
  x = np.array(xyz[:, :, 0])
108
92
 
@@ -110,11 +94,7 @@
110
94
 
111
95
  z = np.array(xyz[:, :, 2])
112
96
 
113
-
114
-
115
97
  cvec = vec[:, :]
116
-
117
-
118
98
 
119
99
  p0 = np.array([x.T, y.T, z.T])
120
100
 
@@ -125,8 +105,6 @@
125
105
  d_vec = p0 - np.repeat(p_ref, 4).reshape(100000, 3, 4)
126
106
 
127
107
  dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
128
-
129
-
130
108
 
131
109
  print('time : ' + str(round((t.time() - start2),5)) + ' [sec]')
132
110
 

4

ソース微修正

2019/04/24 13:22

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -37,6 +37,8 @@
37
37
 
38
38
 
39
39
  ```python
40
+
41
+ import numpy as np
40
42
 
41
43
  import time as t
42
44
 

3

ソース微修正

2019/04/24 13:20

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -39,8 +39,6 @@
39
39
  ```python
40
40
 
41
41
  import time as t
42
-
43
- import sys
44
42
 
45
43
 
46
44
 

2

質問内容を大幅に変更

2019/04/24 13:20

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,52 +1,54 @@
1
- ※質問に不備があるめ編集予定
1
+ 丸投げというご指摘があり、質問を大幅見直しまし。大変申し訳ございませんした
2
+
3
+
2
4
 
3
5
  **質問内容**
4
6
 
5
- python3で作成したプログラムの高速化を検討しております。
7
+ python3で作成した内積を計算するプログラムの高速化を検討しております。
6
8
 
7
- 別途作成したプログラムロジックの修正よびCythonの実装で爆速(1万倍高速)たのを経験いたしました。
9
+ はじめはfor文を使用ておりましので、for文を使わないようにロジックをみなおしました。
8
-
9
- そのため、今回も同じようにロジックの修正およびCythonでの高速化を考えております。しかし、私の脳みそではなかなかロジックの修正案が浮かびません。ロジックの修正(もし可能ならCythonまで)についてご教授頂けると非常に助かります。
10
-
11
- なおロジックは公開されている下記論文が元となっております。
12
-
13
- サンプルプログラムは私の環境では現状0.6秒です。1万倍の高速とは言わず10倍でもうれしいです。
14
-
15
- (自分で考えろって感じですが、時間が限られているので泣きの質問です)
16
10
 
17
11
 
18
12
 
19
- **ロジックについて**
13
+ 下記に、ロジック修正前とロジック修正後のソースを示します。
20
14
 
21
- スラントレンジベクトルと標高小面の4隅の位置情報から標高小面のスラントレンジベクトルと直交する面への投影面積を算出するプログラムを作成しました。
22
15
 
23
- 下記論文のFig.6にある投影面積の算出プログラムになります。論文にあるロジックを使っております。
24
16
 
17
+ ロジック修正により5倍ほど処理時間は速くなりましたが、
18
+
19
+ さらに速くしたいと考えております。
20
+
21
+
22
+
23
+ ロジック修正後では、以下のループの部分がボトルネックとなっております。
24
+
25
+
26
+
27
+ p0 = [p0[:, i, :] for i in range(100000)]
28
+
25
- http://www.geo.uzh.ch/microsite/rsl-documents/research/publications/peer-reviewed-articles/201108-TGRS-Small-tcGamma-3809999360/201108-TGRS-Small-tcGamma.pdf
29
+ dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
30
+
31
+
32
+
33
+ この部分を高速化することは可能でしょうか?
34
+
35
+ 大変お手数ですが、ご回答頂けると助かります。
26
36
 
27
37
 
28
38
 
29
39
  ```python
30
40
 
31
- import numpy as np
41
+ import time as t
32
42
 
33
- import time as t
43
+ import sys
34
44
 
35
45
 
36
46
 
37
- start = t.time()
47
+ np.random.seed(0)
38
48
 
39
- # Position information of four corners of elevation facets
49
+ xyz = np.random.rand(4, 100000, 3)
40
50
 
41
- xyz = np.random.rand(4, 10000, 3)
42
-
43
- # slant range vectors
44
-
45
- vec = np.random.rand(3, 10000)
51
+ vec = np.random.rand(3, 100000)
46
-
47
-
48
-
49
- area = np.zeros(xyz.shape[1])
50
52
 
51
53
 
52
54
 
@@ -54,7 +56,13 @@
54
56
 
55
57
 
56
58
 
59
+ print('===== ロジック修正前 START =====')
60
+
61
+
62
+
63
+ start1 = t.time()
64
+
57
- for i in range(xyz.shape[1]):
65
+ for i in range(100000):
58
66
 
59
67
 
60
68
 
@@ -80,69 +88,49 @@
80
88
 
81
89
  dat0 = np.dot(cvec, d_vec)
82
90
 
83
- dat1 = np.repeat(dat0, 3).reshape(4, 3).T
84
91
 
92
+
93
+ print('time : ' + str(round((t.time() - start1),5)) + ' [sec]')
94
+
85
- cvec2 = np.dot(cvec, cvec)
95
+ print('===== ロジック修正前ソース END =====')
86
96
 
87
97
 
88
98
 
89
- n_cvec = cvec / cvec2
90
-
91
- m_cvec = np.repeat(n_cvec, 4).reshape(3, 4)
99
+ print('===== ロジック修正後ソース START =====')
92
-
93
- p1 = p0 - dat1 * m_cvec
94
100
 
95
101
 
96
102
 
97
- # triangle P1
103
+ start2 = t.time()
98
-
99
- d00_01 = p1[:, 0] - p1[:, 1]
100
-
101
- d00_10 = p1[:, 0] - p1[:, 2]
102
-
103
- d10_01 = p1[:, 2] - p1[:, 1]
104
104
 
105
105
 
106
106
 
107
- p00_01 = np.sqrt(np.dot(d00_01, d00_01)) # distance
107
+ x = np.array(xyz[:, :, 0])
108
108
 
109
- p00_10 = np.sqrt(np.dot(d00_10, d00_10)) # distance
109
+ y = np.array(xyz[:, :, 1])
110
110
 
111
- p10_01 = np.sqrt(np.dot(d10_01, d10_01)) # distance
111
+ z = np.array(xyz[:, :, 2])
112
112
 
113
113
 
114
114
 
115
- h1 = (p00_01 + p00_10 + p10_01) / 2 # semi-perimeter of the triangles P1
115
+ cvec = vec[:, :]
116
116
 
117
117
 
118
118
 
119
- # triangle P2
119
+ p0 = np.array([x.T, y.T, z.T])
120
120
 
121
- d11_01 = p1[:, 3] - p1[:, 1]
121
+ p0 = [p0[:, i, :] for i in range(100000)]
122
122
 
123
- d11_10 = p1[:, 3] - p1[:, 2]
123
+ p_ref = np.array([x[0], y[0], z[0]])
124
+
125
+ d_vec = p0 - np.repeat(p_ref, 4).reshape(100000, 3, 4)
126
+
127
+ dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
124
128
 
125
129
 
126
130
 
127
- p11_01 = np.sqrt(np.dot(d11_01, d11_01)) # distance
131
+ print('time : ' + str(round((t.time() - start2),5)) + ' [sec]')
128
132
 
129
- p11_10 = np.sqrt(np.dot(d11_10, d11_10)) # distance
130
-
131
-
132
-
133
- h2 = (p11_01 + p11_10 + p10_01) / 2 # semi-perimeter of the triangles P1
134
-
135
-
136
-
137
- a_p1 = np.sqrt(h1 * (h1 - p00_01) * (h1 - p00_10) * (h1 - p10_01))
138
-
139
- a_p2 = np.sqrt(h2 * (h2 - p11_01) * (h2 - p11_10) * (h2 - p10_01))
140
-
141
- area[i] = a_p1 + a_p2
142
-
143
-
144
-
145
- print('time : ' + str(round((t.time() - start),3)) + ' [sec]')
133
+ print('===== ロジック修正後ソース END =====')
146
134
 
147
135
 
148
136
 

1

コメント追加

2019/04/24 09:00

投稿

dream-20xx
dream-20xx

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ ※質問に不備があるため編集予定です。
2
+
1
3
  **質問内容**
2
4
 
3
5
  python3で作成したプログラムの高速化を検討しております。