回答編集履歴

1

速度について

2018/11/11 10:30

投稿

KojiDoi
KojiDoi

スコア13671

test CHANGED
@@ -19,3 +19,127 @@
19
19
  ただ、中身が複雑になってくると、みにくくはなります。
20
20
 
21
21
  よほどスピードが求められるのでない限り、素直にforループを使ったほうがいいと思います。
22
+
23
+
24
+
25
+ #速度について
26
+
27
+ 「よほどスピードが求められるのでない限り」とか何となく書いてしまいましたが、実際のところ実行時間に差が出るものか試してみました。
28
+
29
+ 質問文にある程度の組み合わせ量ではどのみち差が出ないので、ループ回数をふやしての実験です。
30
+
31
+ ```
32
+
33
+ Rprof(tmp<-tempfile(), interval=0.01)
34
+
35
+
36
+
37
+ #ii <- 1:3000
38
+
39
+ #jj <- seq(11,15,2)
40
+
41
+ #kk <- seq(101,110,3)
42
+
43
+ ii <- 1:100
44
+
45
+ jj <- 1:100
46
+
47
+ kk <- 1:100
48
+
49
+
50
+
51
+ func1 <- function(){
52
+
53
+ for (i in ii) {
54
+
55
+ for (j in jj) {
56
+
57
+ for (k in kk) {
58
+
59
+ # print(paste(paste(i,j),k))
60
+
61
+ }
62
+
63
+ }
64
+
65
+ }
66
+
67
+ }
68
+
69
+
70
+
71
+ func2 <- function(){
72
+
73
+ sapply(ii, function(i){
74
+
75
+ sapply(jj, function(j){
76
+
77
+ sapply(kk, function(k){
78
+
79
+ # print(paste(i,j,k))
80
+
81
+ })
82
+
83
+ })
84
+
85
+ })
86
+
87
+ return(invisible())
88
+
89
+ }
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+ func3 <- function(){
98
+
99
+ apply(expand.grid(ii, jj, kk), 1, function(x){
100
+
101
+ # print(paste(x[1],x[2],x[3]))
102
+
103
+ })
104
+
105
+ return(invisible())
106
+
107
+ }
108
+
109
+
110
+
111
+ func1()
112
+
113
+ func2()
114
+
115
+ func3()
116
+
117
+
118
+
119
+ Rprof(NULL)
120
+
121
+ profres <- summaryRprof(tmp)
122
+
123
+ print(profres$by.total[grep("func[1-3]", rownames(profres$by.total)),])
124
+
125
+ ```
126
+
127
+
128
+
129
+ 結果は次の通り。
130
+
131
+ ```
132
+
133
+ > source("test.r")
134
+
135
+ total.time total.pct self.time self.pct
136
+
137
+ "func3" 3.59 62.87 0.00 0.00
138
+
139
+ "func2" 2.06 36.08 0.00 0.00
140
+
141
+ "func1" 0.06 1.05 0.06 1.05
142
+
143
+ ```
144
+
145
+ なんとforループがダントツでした。expand.gridではいったんすべての組み合わせをリストアップしたリストを作るため、そのオーバーヘッドが生じていると想像されます。