2018年
11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2018-11-18 Rの高速化

_ データフレームの扱い

Rを使って結晶内の特定の距離の範囲内にある原子を数え上げるプログラムを作っていたのだが、実行が異様に遅い。いろいろと試してみると、データフレームを結合するために使っているrbindのところで、ほとんどの時間を使っていることが分かった。webで検索してみると、dplyrというlibraryのbind_rowsを使うと速くなるというので、試してみたら、なんとか許容範囲の実行時間になって来た。

しかし、もっと速くできるのでは無いかといろいろと試行錯誤していたら、かなり速くすることに成功した。expand.gridを使うと、指定したすべての組み合わせのデータフレームを作ってくれるので、それを利用した。極端な例でこれを説明しよう。

球の中にある格子点の数を数えるプログラムを作るとしよう。座標をふって球の中にある場合に、データフレームに加えていくということをする場合には、以下のようなプログラムになる。

d<-data.frame(x=c(),y=c(),z=c())
for(x in -10:10){
for(y in -10:10){
for(z in -10:10){
 if(x^2+y^2+z^2<100){
  d<-rbind(d,data.frame(x=x,y=y,z=z))
 }
}}}

このrbindが時間をかなり使っているようだ。これをexpand.gridで格子点を作って、それを一度に条件判定をするプログラムは、以下のようになる。

d<-expand.grid(x=-10:10,y=-10:10,z=-10:10)
d<-subset(d,x^2+y^2+z^2<100)

このときの実行時間は、数百倍も違う。こんなに違うのかと、少し驚いたが、今後Rを使うときには、このようなことを考慮しようと思う。