SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
Rの高速化
 Kashiwa.R#1
  11 / 11 / 11
 @antiplastics
自己紹介
所属: 東京理科大学大学院
    薬学研究科
    修士課程2年 (来年からD進学予定)

専門: バイオインフォマティクス

twitterアカウント: @antiplastics

趣味: バイク、サーフィン、アニメ、読書など

研究内容: マイクロアレイデータからの
      発現変動遺伝子の検出
扱っているデータの構造
              実験1    実験2    実験3            実験287   実験288   実験289
    遺伝子1      1.7    3.9     4.8            4.4     2.5     4.8    実験特異的遺伝子
    遺伝子2      -3.3   -0.2    0.2            -4.1    3.1     3.1    発現の検出 など




    遺伝子5547   -1.2   4.6     -0.9           4.6     -4.4    1.5
    遺伝子5548   1.3    2.7     1.6            6.1     -1.4    3.1
    遺伝子5549   2.2    3.2     -1.4           1.3     -3.2    2.0

                            発現変動遺伝子の検出 など

  行 (生物の遺伝子数)                                 列 (実験データの数)
*原核生物(大腸菌、緑膿菌など)                        *ますます増加するデータベースへの登録件数
      6000gene
 *真菌(カビ、酵母など)                       ×   *NGS(次世代シーケンサ)の登場
      10000gene
 *真核生物(ヒト、マウスなど)
      20000gene



                     超多次元、多変量の大規模データ!!
データ解析の現場の実情



     動画
遅い!!!
(ノ; _ ;)ノ ┫:・'.::
結果待ちに数日かかる事もたびたび。
計算が速く終わるかどうかは死活問題。
Rはパッケージがとても豊富。
library(“hogehoge”)とか打ったら小難しい計算も、関数が勝
       手にやってくれるからコード行数も少なくて済む。
                   めちゃくちゃ便利!


  だが現実問題これだけ遅いと、やってられない時も。




  →Rを高速化させて、サクサク研究を進めたい!!

 →速くしようと思ったらどこまで速くなるかをみてみよう。
使用するマシン
  iMac(21.5inch)
    OS: MacOSⅩ10.6.8
         SnowLeopard(64bit)
    CPU: 2.8GHz
           Intel Corei7(コア数:4)
    メモリ: 8GB
    HDD: 1TB

  以下全てのプログラムはこのマシン上
   で走らせる事とする。
比較する計算
以下の数値積分(中点法)により近時的に円周率
 πを求める。




         =




             N(ステップ数)が増すほど精度が上がる
             今回は1千万(107)ステップで計算する
Cのソースコード
#include<stdio.h>
#include<time.h>
#define num_steps 10000000           107という値をとる変数num_stepsを定義

int main(void){
   clock_t t1, t2;
           t1 = clock();
           int i;
           double x,pi,sum=0.0,step;
           step = 1.0 / (double) num_steps;          ステップ = 1/107を定義

             for(i = 1;i <= num_steps; i++){
                         x = (i - 0.5) * step;
                         sum = sum + 4.0 / (1.0 + x * x);
                                                            各ステップ毎に長方形の面積を
             }                                              計算し、最後に和を求める
             pi = step * sum;
             printf("%f¥n",pi);
             t2 = clock();
    printf("%f¥n", (double)(t2 - t1) / CLOCKS_PER_SEC);
             return(0);
}
Perlのソースコード
$t1 = (times)[0];
$num_steps = 10000000;
$step = 1.0 / $num_steps;

        for($i = 1;$i <= $num_steps; $i++){
                 $x = ($i - 0.5) * $step;
                 $sum = $sum + 4.0 / (1.0 + $x * $x);
        }
        $pi = $step * $sum;
        print $pi;
        print "¥n";

$t2 = (times)[0];
$t3 = $t2 - $t1;
print "$t3 秒¥n";
Pythonのソースコード
import sys
import time
before = time.time()
num_steps = 10000000
sum = 0
step = 1.0 / num_steps

for i in range(1,num_steps):
          x = (i - 0.5) * step
          sum = sum + 4.0 / (1.0 + x * x)

pi = step * sum
print pi
print "¥n"

after = time.time()
print "Running Time =", after - before, "s"
Rubyのソースコード
require "benchmark"
num_steps = 10000000
step = 1.0 / num_steps
sum = 0

puts Benchmark::CAPTION
puts Benchmark.measure{
          for i in 1 .. num_steps
                      x = (i - 0.5) * step
                      sum = sum + 4.0 / (1.0 + x * x)
          end
pi = step * sum
puts pi
}
結果
    ランク   言語     実行時間(s)
     1    C        0.15
     2    Python   5.19
     3    Perl     5.59
     4    Ruby     9.12



やはりCは最速。スクリプト言語とCの差は大きい。
R <R-2.12.1,64bit> のソースコード
                        *このくらいのステップ数だと32bitのRは使えなくなるので注意。

before <- proc.time()

num_steps <- 10000000
       step <- 1.0 / num_steps
       summ <- 0
       for(i in 1:num_steps){
                 x <- (i - 0.5) * step
                 summ <- summ + 4.0 / (1.0 + x * x)
       }
       pi <- step * summ
       print(pi)

after <- proc.time()
print(after – before)
結果
      ランク   言語     実行時間(s)
       1    C        0.15
       2    Python   5.19
       3    Perl     5.59
       4    Ruby     9.12
new    5    R        23.28


       遅い…orz
Rの高速化手法① プログラム修正
before <- proc.time()

num_steps <- 1:10000000           num_stepsを変数からベクトルへ変更
  step <- 1.0 / 10000000

         x <- (num_steps - 0.5) * step           for文をやめて、ベクトルに
         pi <- sum((4.0 / (1.0 + x * x))*step)   一度にアクセスするような
                                                 書き方をする
   print(pi)

after <- proc.time()
print(after - before)
結果
      ランク   言語         実行時間(s)
       1    C            0.15
new    2    R(プログラム修正)   0.30
       3    Python       5.19
       4    Perl         5.59
       5    Ruby         9.12
       6    R            23.28

       スクリプト言語をぶち抜きましたwww
Rの高速化手法② apply関数の使用

apply関数ファミリー
①で行なったベクトル、行列に同時にアクセス
するような計算を、より明示的にできる関数。入
力データの型、出力データの型の違いなどで、
apply(),lapply(), sapply(), mapply(), tapply()
  がある。
Rの高速化手法② apply関数の使用

before <- proc.time()

num_steps <- 1:10000000
step <- 1.0 / 10000000

menseki <- function(A){
        x <- (A - 0.5) * step
                                       各ステップで長方形の面積を求める計算は、一
        y <- 4.0 / (1.0 + x * x)
                                       度関数として定義する
        return(y*step)
}

pi <- sum(sapply(num_steps,menseki))     sapplyを使って、配列num_stepsの各要
print(pi)                                素に関数mensekiを適用する。

after <- proc.time()
print(after - before)
結果
      ランク   言語         実行時間(s)
       1    C            0.15
       2    R(プログラム修正)   0.30
       3    Python       5.19
       4    Perl         5.59
       5    Ruby         9.12
       6    R            23.28
new    7    R(apply)     54.16

かえって遅くなった…。ただし、apply関数を覚
えておくといい事がある(後述)。
Rの高速化手法③ 並列化
           snowパッケージを使えば、先程のapply関数が並列に計算できる!

applyファミリー          snowのでのapplyファミリー
apply()             parApply()          #行列用
lapply()            parLapply()         #リスト用
sapply()            parSapply()         #ベクトル、行列用
mapply()            ×                   #グループ化されたデータ用
tapply()            ×                   #規則的なリストの作成
×                   parRapply()         #行列の行に対して
×                   parCapply()         #行列の列に対して
×                   parMM()             #行列同士の掛け算
Rの高速化手法③ 並列化
before <- proc.time()
library("snow")
library(“Rmpi”)                              snowによりMPIクラスターを4個生成
cl <- makeCluster(4,type=“MPI")

num_steps <- 1:10000000
step <- 1.0 / 10000000
clusterExport(cl,”step”)

menseki <- function(A){
         x <- (A - 0.5) * step
         y <- 4.0 / (1.0 + x * x)            各ステップで長方形の面積を求める計算
         return(y*step)                      は、一度関数として定義する
}
                                               snow内で並列化対応したsapplyであ
pi <- sum(parSapply(cl,num_steps,menseki))
print(pi)
                                               るparSapplyを使う

after <- proc.time()
print(after - before)
stopCluster(cl)
結果
      ランク   言語           実行時間(s)
       1    C               0.15
       2    R(プログラム修正)      0.30
       3    Python          5.19
       4    Perl            5.59
       5    Ruby            9.12
new    6    R(snow)        17.35
       7    R              23.28
       8    R(apply)       54.16
Rの高速化手法④ ffパッケージ
      Rはメモリを逼迫させる。

→データはハードディスクから、必要に応じてメモリに
         ロードしたい。

*ベクトル、行列、因子などのデータ: ffパッケージ
  *行列のデータ: bigmemoryパッケージ


しかも上記の2つは並列化まであわせてやってくれる!
Rの高速化手法④ ffパッケージ
before <- proc.time()
library(ff)
library(snowfall)
sfInit(parallel=TRUE, cpus=4,type=“MPI")         4つのクラスターを生成
num_steps <-ff(vmode="integer",1:10000000,length=10000000)
            step <- 1.0 / 10000000                         ff,stepを各クラス
sfLibrary(ff)                                              ターにエクスポート
sfExport("step")

menseki <- function(A){
          x <- (A - 0.5) * step
          y <- 4.0 / (1.0 + x * x)       snowfall内でのsapply()である、
          return(y*step)                 sfSapply()を使う
}
pi <- sum(sfSapply(num_steps,menseki))
print(pi)

after <- proc.time()
print(after - before)
結果
      ランク   言語              実行時間(s)

       1    C                  0.15
       2    R(プログラム修正)         0.30
       3    Python             5.19
       4    Perl               5.59
       5    Ruby               9.12
new    6    R(ff)              17.00
       7    R(snow)            17.35
       8    R                  23.28
       9    R(apply)           54.16


                snowより若干速いくらい
Rの高速化手法⑤ バイトコンパイラーの使用

                 あらかじめ構文解析後の関数にしておく。
  人が見ても何しているのかわからない機械語に近い形式になる。

                                                     バイトコンパイル後
                                         list(.Code, list(7L, GETVAR.OP, 1L,
                                         LDCONST.OP, 2L, SUB.OP, 3L,
                                             GETVAR.OP, 4L, MUL.OP, 5L,
          ①library(“compiler”)           SETVAR.OP, 6L, POP.OP, LDCONST.OP,
          ②menseki2 <- cmpfun(menseki)       7L, LDCONST.OP, 8L, GETVAR.OP, 6L,
          ③disassemble(menseki2)         GETVAR.OP, 6L, MUL.OP,
                                             9L, ADD.OP, 10L, DIV.OP, 11L,
                                         SETVAR.OP, 12L, POP.OP, GETVAR.OP,
      バイトコンパイル前                              12L, GETVAR.OP, 4L, MUL.OP, 13L,
                                         RETURN.OP), list({
menseki <- function(A){                      x <- (A - 0.5) * step
        x <- (A - 0.5) * step                y <- 4/(1 + x * x)
        y <- 4.0 / (1.0 + x * x)             return(y * step)
                                         }, A, 0.5, A - 0.5, step, (A - 0.5) * step, x, 4, 1,
        return(y*step)                   x * x, 1 +
}                                            x * x, 4/(1 + x * x), y, y * step))
Rの高速化手法⑤ バイトコンパイラーの使用
before <- proc.time()
library("compiler")

num_steps <- 1:10000000
       step <- 1.0 / 10000000

menseki <- function(A){
        x <- (A - 0.5) * step
        y <- 4.0 / (1.0 + x * x)
        return(y*step)
}

menseki2 <- cmpfun(menseki)        バイトコンパイル

pi <- sum(sapply(num_steps,menseki2))
print(pi)

after <- proc.time()
print(after - before)
結果
      ランク   言語                    実行時間(s)

       1    C                        0.15
       2    R(プログラム修正)               0.30
       3    Python                   5.19
       4    Perl                     5.59
       5    Ruby                     9.12
       6    R(ff)                    17.00
       7    R(snow)                  17.35
       8    R                        23.28
new    9    R(compiler + apply)      41.14
       10   R(apply)                 54.16
並列化と組み合わせ
      ランク   言語                    実行時間(s)
       1    C                         0.15
       2    R(プログラム修正)                0.30
       3    Python                    5.19
       4    Perl                      5.59
       5    Ruby                      9.12
new    6    R(compiler + ff)         14.41
new    7    R(compiler + snow)       15.11
       8    R(ff)                    17.00
       9    R(snow)                  17.35
       10   R                        23.28
       11   R(compiler + apply)      41.14
       12   R(apply)                 54.16
Rの高速化手法⑥ R-2.14.0
最新VerのR-2.14.0はかなり速い。
*全ての基本パッケージの関数があらかじめ、バ
 イトコンパイルされているとか
            R-2.4.0    30.1s
            R-2.8.0    30.8s
            R-2.9.10   31.7s
            R-2.10.0   31.7s
            R-2.11.0   24.2s
                                64bit化
            R-2.12.1   23.28s
            R-2.13.2   24.4s
        ?
            R-2.14.0   ?
                                バイトコンパイル化
            の順
最終結果
      ランク   言語                    実行時間(s)
       1    C                         0.15
       2    R(プログラム修正)                0.30
       3    Python                    5.19
       4    Perl                      5.59
       5    Ruby                      9.12
       6    R(compiler + ff)         14.41
       7    R(compiler + snow)       15.11
       8    R(ff)                    17.00
       9    R(snow)                  17.35
new    10   R(2.14.0)                22.01
       11   R                        23.28
       12   R(compiler + apply)      41.14
       13   R(apply)                 54.16
時間の関係でできなかった
           高速化手法
•   Revolution R
    インストール時にコア数を勝手に調べて、マルチコア対応に計算を実行してくれる新型R
    (Windows、Redhat用)。普通のRより2〜3倍速いという噂。

•   RCCコンパイラー
    R→C++に変換できます(Windows、Linux用)。

•   RDBMSの利用
    Rでリレーショナルデータベース(MySQL,PostgreSQL,RODBC,MiniSQL)がいじれます。

•   Hadoop,Mapreduceの利用
    http://www.slideshare.net/holidayworking/rmapreduce (以前のTokyo.Rのスライド)

•   R+クラウドコンピューティング
    segue: アマゾンがやっているlapply関数を並列に計算してくれるサービス(Mac,Linux用)。
    http://code.google.com/p/segue/

Más contenido relacionado

La actualidad más candente

ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定Akira Masuda
 
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリングベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング宏喜 佐野
 
Stanの便利な事後処理関数
Stanの便利な事後処理関数Stanの便利な事後処理関数
Stanの便利な事後処理関数daiki hojo
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
Granger因果による 時系列データの因果推定(因果フェス2015)
Granger因果による時系列データの因果推定(因果フェス2015)Granger因果による時系列データの因果推定(因果フェス2015)
Granger因果による 時系列データの因果推定(因果フェス2015)Takashi J OZAKI
 
状態空間モデルの考え方・使い方 - TokyoR #38
状態空間モデルの考え方・使い方 - TokyoR #38状態空間モデルの考え方・使い方 - TokyoR #38
状態空間モデルの考え方・使い方 - TokyoR #38horihorio
 
2 6.ゼロ切断・過剰モデル
2 6.ゼロ切断・過剰モデル2 6.ゼロ切断・過剰モデル
2 6.ゼロ切断・過剰モデルlogics-of-blue
 
Rで階層ベイズモデル
Rで階層ベイズモデルRで階層ベイズモデル
Rで階層ベイズモデルYohei Sato
 
変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)Takao Yamanaka
 
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~nocchi_airport
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたKazuya Wada
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使うAtsushi Hayakawa
 
『バックドア基準の入門』@統数研研究集会
『バックドア基準の入門』@統数研研究集会『バックドア基準の入門』@統数研研究集会
『バックドア基準の入門』@統数研研究集会takehikoihayashi
 
ベルヌーイ分布からベータ分布までを関係づける
ベルヌーイ分布からベータ分布までを関係づけるベルヌーイ分布からベータ分布までを関係づける
ベルヌーイ分布からベータ分布までを関係づけるitoyan110
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門ryosuke-kojima
 
15分でわかる(範囲の)ベイズ統計学
15分でわかる(範囲の)ベイズ統計学15分でわかる(範囲の)ベイズ統計学
15分でわかる(範囲の)ベイズ統計学Ken'ichi Matsui
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布についてhoxo_m
 
最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向ohken
 
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages.
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages. Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages.
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages. Satoshi Kato
 

La actualidad más candente (20)

ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定ようやく分かった!最尤推定とベイズ推定
ようやく分かった!最尤推定とベイズ推定
 
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリングベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
ベイジアンモデリングによるマーケティングサイエンス〜状態空間モデルを用いたモデリング
 
Stanの便利な事後処理関数
Stanの便利な事後処理関数Stanの便利な事後処理関数
Stanの便利な事後処理関数
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
Granger因果による 時系列データの因果推定(因果フェス2015)
Granger因果による時系列データの因果推定(因果フェス2015)Granger因果による時系列データの因果推定(因果フェス2015)
Granger因果による 時系列データの因果推定(因果フェス2015)
 
状態空間モデルの考え方・使い方 - TokyoR #38
状態空間モデルの考え方・使い方 - TokyoR #38状態空間モデルの考え方・使い方 - TokyoR #38
状態空間モデルの考え方・使い方 - TokyoR #38
 
2 6.ゼロ切断・過剰モデル
2 6.ゼロ切断・過剰モデル2 6.ゼロ切断・過剰モデル
2 6.ゼロ切断・過剰モデル
 
Rで階層ベイズモデル
Rで階層ベイズモデルRで階層ベイズモデル
Rで階層ベイズモデル
 
Stan超初心者入門
Stan超初心者入門Stan超初心者入門
Stan超初心者入門
 
変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)変分推論法(変分ベイズ法)(PRML第10章)
変分推論法(変分ベイズ法)(PRML第10章)
 
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
StanとRでベイズ統計モデリング読書会 Chapter 7(7.6-7.9) 回帰分析の悩みどころ ~統計の力で歌うまになりたい~
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使う
 
『バックドア基準の入門』@統数研研究集会
『バックドア基準の入門』@統数研研究集会『バックドア基準の入門』@統数研研究集会
『バックドア基準の入門』@統数研研究集会
 
ベルヌーイ分布からベータ分布までを関係づける
ベルヌーイ分布からベータ分布までを関係づけるベルヌーイ分布からベータ分布までを関係づける
ベルヌーイ分布からベータ分布までを関係づける
 
グラフニューラルネットワーク入門
グラフニューラルネットワーク入門グラフニューラルネットワーク入門
グラフニューラルネットワーク入門
 
15分でわかる(範囲の)ベイズ統計学
15分でわかる(範囲の)ベイズ統計学15分でわかる(範囲の)ベイズ統計学
15分でわかる(範囲の)ベイズ統計学
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について
 
最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向
 
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages.
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages. Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages.
Dimensionality reduction with t-SNE(Rtsne) and UMAP(uwot) using R packages.
 

Similar a Rの高速化

8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティングTakeshi Takaishi
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座Ruo Ando
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)YoheiOkuyama
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作るgoccy
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 

Similar a Rの高速化 (20)

8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作る
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 

Más de 弘毅 露崎

大規模テンソルデータに適用可能なeinsumの開発
大規模テンソルデータに適用可能なeinsumの開発大規模テンソルデータに適用可能なeinsumの開発
大規模テンソルデータに適用可能なeinsumの開発弘毅 露崎
 
バイオインフォ分野におけるtidyなデータ解析の最新動向
バイオインフォ分野におけるtidyなデータ解析の最新動向バイオインフォ分野におけるtidyなデータ解析の最新動向
バイオインフォ分野におけるtidyなデータ解析の最新動向弘毅 露崎
 
Benchmarking principal component analysis for large-scale single-cell RNA-seq...
Benchmarking principal component analysis for large-scale single-cell RNA-seq...Benchmarking principal component analysis for large-scale single-cell RNA-seq...
Benchmarking principal component analysis for large-scale single-cell RNA-seq...弘毅 露崎
 
scTGIFの鬼QC機能の追加
scTGIFの鬼QC機能の追加scTGIFの鬼QC機能の追加
scTGIFの鬼QC機能の追加弘毅 露崎
 
1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法弘毅 露崎
 
Predicting drug-induced transcriptome responses of a wide range of human cell...
Predicting drug-induced transcriptome responses of a wide range of human cell...Predicting drug-induced transcriptome responses of a wide range of human cell...
Predicting drug-induced transcriptome responses of a wide range of human cell...弘毅 露崎
 
LRBase × scTensorで細胞間コミュニケーションの検出
LRBase × scTensorで細胞間コミュニケーションの検出LRBase × scTensorで細胞間コミュニケーションの検出
LRBase × scTensorで細胞間コミュニケーションの検出弘毅 露崎
 
非負値テンソル分解を用いた細胞間コミュニケーション検出
非負値テンソル分解を用いた細胞間コミュニケーション検出非負値テンソル分解を用いた細胞間コミュニケーション検出
非負値テンソル分解を用いた細胞間コミュニケーション検出弘毅 露崎
 
Exploring the phenotypic consequences of tissue specific gene expression vari...
Exploring the phenotypic consequences of tissue specific gene expression vari...Exploring the phenotypic consequences of tissue specific gene expression vari...
Exploring the phenotypic consequences of tissue specific gene expression vari...弘毅 露崎
 
データベースとデータ解析の融合
データベースとデータ解析の融合データベースとデータ解析の融合
データベースとデータ解析の融合弘毅 露崎
 
ビール砲の放ち方
ビール砲の放ち方ビール砲の放ち方
ビール砲の放ち方弘毅 露崎
 
Identification of associations between genotypes and longitudinal phenotypes ...
Identification of associations between genotypes and longitudinal phenotypes ...Identification of associations between genotypes and longitudinal phenotypes ...
Identification of associations between genotypes and longitudinal phenotypes ...弘毅 露崎
 
A novel method for discovering local spatial clusters of genomic regions with...
A novel method for discovering local spatial clusters of genomic regions with...A novel method for discovering local spatial clusters of genomic regions with...
A novel method for discovering local spatial clusters of genomic regions with...弘毅 露崎
 
Rによる統計解析と可視化
Rによる統計解析と可視化Rによる統計解析と可視化
Rによる統計解析と可視化弘毅 露崎
 
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ弘毅 露崎
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説弘毅 露崎
 
カーネル法を利用した異常波形検知
カーネル法を利用した異常波形検知カーネル法を利用した異常波形検知
カーネル法を利用した異常波形検知弘毅 露崎
 
ISMB読み会 2nd graph kernel
ISMB読み会 2nd graph kernelISMB読み会 2nd graph kernel
ISMB読み会 2nd graph kernel弘毅 露崎
 

Más de 弘毅 露崎 (20)

大規模テンソルデータに適用可能なeinsumの開発
大規模テンソルデータに適用可能なeinsumの開発大規模テンソルデータに適用可能なeinsumの開発
大規模テンソルデータに適用可能なeinsumの開発
 
バイオインフォ分野におけるtidyなデータ解析の最新動向
バイオインフォ分野におけるtidyなデータ解析の最新動向バイオインフォ分野におけるtidyなデータ解析の最新動向
バイオインフォ分野におけるtidyなデータ解析の最新動向
 
Benchmarking principal component analysis for large-scale single-cell RNA-seq...
Benchmarking principal component analysis for large-scale single-cell RNA-seq...Benchmarking principal component analysis for large-scale single-cell RNA-seq...
Benchmarking principal component analysis for large-scale single-cell RNA-seq...
 
R-4.0の解説
R-4.0の解説R-4.0の解説
R-4.0の解説
 
scTGIFの鬼QC機能の追加
scTGIFの鬼QC機能の追加scTGIFの鬼QC機能の追加
scTGIFの鬼QC機能の追加
 
20191204 mbsj2019
20191204 mbsj201920191204 mbsj2019
20191204 mbsj2019
 
1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法1細胞オミックスのための新GSEA手法
1細胞オミックスのための新GSEA手法
 
Predicting drug-induced transcriptome responses of a wide range of human cell...
Predicting drug-induced transcriptome responses of a wide range of human cell...Predicting drug-induced transcriptome responses of a wide range of human cell...
Predicting drug-induced transcriptome responses of a wide range of human cell...
 
LRBase × scTensorで細胞間コミュニケーションの検出
LRBase × scTensorで細胞間コミュニケーションの検出LRBase × scTensorで細胞間コミュニケーションの検出
LRBase × scTensorで細胞間コミュニケーションの検出
 
非負値テンソル分解を用いた細胞間コミュニケーション検出
非負値テンソル分解を用いた細胞間コミュニケーション検出非負値テンソル分解を用いた細胞間コミュニケーション検出
非負値テンソル分解を用いた細胞間コミュニケーション検出
 
Exploring the phenotypic consequences of tissue specific gene expression vari...
Exploring the phenotypic consequences of tissue specific gene expression vari...Exploring the phenotypic consequences of tissue specific gene expression vari...
Exploring the phenotypic consequences of tissue specific gene expression vari...
 
データベースとデータ解析の融合
データベースとデータ解析の融合データベースとデータ解析の融合
データベースとデータ解析の融合
 
ビール砲の放ち方
ビール砲の放ち方ビール砲の放ち方
ビール砲の放ち方
 
Identification of associations between genotypes and longitudinal phenotypes ...
Identification of associations between genotypes and longitudinal phenotypes ...Identification of associations between genotypes and longitudinal phenotypes ...
Identification of associations between genotypes and longitudinal phenotypes ...
 
A novel method for discovering local spatial clusters of genomic regions with...
A novel method for discovering local spatial clusters of genomic regions with...A novel method for discovering local spatial clusters of genomic regions with...
A novel method for discovering local spatial clusters of genomic regions with...
 
Rによる統計解析と可視化
Rによる統計解析と可視化Rによる統計解析と可視化
Rによる統計解析と可視化
 
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説
 
カーネル法を利用した異常波形検知
カーネル法を利用した異常波形検知カーネル法を利用した異常波形検知
カーネル法を利用した異常波形検知
 
ISMB読み会 2nd graph kernel
ISMB読み会 2nd graph kernelISMB読み会 2nd graph kernel
ISMB読み会 2nd graph kernel
 

Último

TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 

Último (12)

TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 

Rの高速化

  • 1. Rの高速化 Kashiwa.R#1 11 / 11 / 11 @antiplastics
  • 2. 自己紹介 所属: 東京理科大学大学院 薬学研究科 修士課程2年 (来年からD進学予定) 専門: バイオインフォマティクス twitterアカウント: @antiplastics 趣味: バイク、サーフィン、アニメ、読書など 研究内容: マイクロアレイデータからの 発現変動遺伝子の検出
  • 3. 扱っているデータの構造 実験1 実験2 実験3 実験287 実験288 実験289 遺伝子1 1.7 3.9 4.8 4.4 2.5 4.8 実験特異的遺伝子 遺伝子2 -3.3 -0.2 0.2 -4.1 3.1 3.1 発現の検出 など 遺伝子5547 -1.2 4.6 -0.9 4.6 -4.4 1.5 遺伝子5548 1.3 2.7 1.6 6.1 -1.4 3.1 遺伝子5549 2.2 3.2 -1.4 1.3 -3.2 2.0 発現変動遺伝子の検出 など 行 (生物の遺伝子数) 列 (実験データの数) *原核生物(大腸菌、緑膿菌など) *ますます増加するデータベースへの登録件数 6000gene *真菌(カビ、酵母など) × *NGS(次世代シーケンサ)の登場 10000gene *真核生物(ヒト、マウスなど) 20000gene 超多次元、多変量の大規模データ!!
  • 5. 遅い!!! (ノ; _ ;)ノ ┫:・'.:: 結果待ちに数日かかる事もたびたび。 計算が速く終わるかどうかは死活問題。
  • 6. Rはパッケージがとても豊富。 library(“hogehoge”)とか打ったら小難しい計算も、関数が勝 手にやってくれるからコード行数も少なくて済む。 めちゃくちゃ便利! だが現実問題これだけ遅いと、やってられない時も。 →Rを高速化させて、サクサク研究を進めたい!! →速くしようと思ったらどこまで速くなるかをみてみよう。
  • 7. 使用するマシン iMac(21.5inch) OS: MacOSⅩ10.6.8 SnowLeopard(64bit) CPU: 2.8GHz Intel Corei7(コア数:4) メモリ: 8GB HDD: 1TB 以下全てのプログラムはこのマシン上 で走らせる事とする。
  • 8. 比較する計算 以下の数値積分(中点法)により近時的に円周率 πを求める。 = N(ステップ数)が増すほど精度が上がる 今回は1千万(107)ステップで計算する
  • 9. Cのソースコード #include<stdio.h> #include<time.h> #define num_steps 10000000 107という値をとる変数num_stepsを定義 int main(void){ clock_t t1, t2; t1 = clock(); int i; double x,pi,sum=0.0,step; step = 1.0 / (double) num_steps; ステップ = 1/107を定義 for(i = 1;i <= num_steps; i++){ x = (i - 0.5) * step; sum = sum + 4.0 / (1.0 + x * x); 各ステップ毎に長方形の面積を } 計算し、最後に和を求める pi = step * sum; printf("%f¥n",pi); t2 = clock(); printf("%f¥n", (double)(t2 - t1) / CLOCKS_PER_SEC); return(0); }
  • 10. Perlのソースコード $t1 = (times)[0]; $num_steps = 10000000; $step = 1.0 / $num_steps; for($i = 1;$i <= $num_steps; $i++){ $x = ($i - 0.5) * $step; $sum = $sum + 4.0 / (1.0 + $x * $x); } $pi = $step * $sum; print $pi; print "¥n"; $t2 = (times)[0]; $t3 = $t2 - $t1; print "$t3 秒¥n";
  • 11. Pythonのソースコード import sys import time before = time.time() num_steps = 10000000 sum = 0 step = 1.0 / num_steps for i in range(1,num_steps): x = (i - 0.5) * step sum = sum + 4.0 / (1.0 + x * x) pi = step * sum print pi print "¥n" after = time.time() print "Running Time =", after - before, "s"
  • 12. Rubyのソースコード require "benchmark" num_steps = 10000000 step = 1.0 / num_steps sum = 0 puts Benchmark::CAPTION puts Benchmark.measure{ for i in 1 .. num_steps x = (i - 0.5) * step sum = sum + 4.0 / (1.0 + x * x) end pi = step * sum puts pi }
  • 13. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 Python 5.19 3 Perl 5.59 4 Ruby 9.12 やはりCは最速。スクリプト言語とCの差は大きい。
  • 14. R <R-2.12.1,64bit> のソースコード *このくらいのステップ数だと32bitのRは使えなくなるので注意。 before <- proc.time() num_steps <- 10000000 step <- 1.0 / num_steps summ <- 0 for(i in 1:num_steps){ x <- (i - 0.5) * step summ <- summ + 4.0 / (1.0 + x * x) } pi <- step * summ print(pi) after <- proc.time() print(after – before)
  • 15. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 Python 5.19 3 Perl 5.59 4 Ruby 9.12 new 5 R 23.28 遅い…orz
  • 16. Rの高速化手法① プログラム修正 before <- proc.time() num_steps <- 1:10000000 num_stepsを変数からベクトルへ変更 step <- 1.0 / 10000000 x <- (num_steps - 0.5) * step for文をやめて、ベクトルに pi <- sum((4.0 / (1.0 + x * x))*step) 一度にアクセスするような 書き方をする print(pi) after <- proc.time() print(after - before)
  • 17. 結果 ランク 言語 実行時間(s) 1 C 0.15 new 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 6 R 23.28 スクリプト言語をぶち抜きましたwww
  • 19. Rの高速化手法② apply関数の使用 before <- proc.time() num_steps <- 1:10000000 step <- 1.0 / 10000000 menseki <- function(A){ x <- (A - 0.5) * step 各ステップで長方形の面積を求める計算は、一 y <- 4.0 / (1.0 + x * x) 度関数として定義する return(y*step) } pi <- sum(sapply(num_steps,menseki)) sapplyを使って、配列num_stepsの各要 print(pi) 素に関数mensekiを適用する。 after <- proc.time() print(after - before)
  • 20. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 6 R 23.28 new 7 R(apply) 54.16 かえって遅くなった…。ただし、apply関数を覚 えておくといい事がある(後述)。
  • 21. Rの高速化手法③ 並列化 snowパッケージを使えば、先程のapply関数が並列に計算できる! applyファミリー snowのでのapplyファミリー apply() parApply() #行列用 lapply() parLapply() #リスト用 sapply() parSapply() #ベクトル、行列用 mapply() × #グループ化されたデータ用 tapply() × #規則的なリストの作成 × parRapply() #行列の行に対して × parCapply() #行列の列に対して × parMM() #行列同士の掛け算
  • 22. Rの高速化手法③ 並列化 before <- proc.time() library("snow") library(“Rmpi”) snowによりMPIクラスターを4個生成 cl <- makeCluster(4,type=“MPI") num_steps <- 1:10000000 step <- 1.0 / 10000000 clusterExport(cl,”step”) menseki <- function(A){ x <- (A - 0.5) * step y <- 4.0 / (1.0 + x * x) 各ステップで長方形の面積を求める計算 return(y*step) は、一度関数として定義する } snow内で並列化対応したsapplyであ pi <- sum(parSapply(cl,num_steps,menseki)) print(pi) るparSapplyを使う after <- proc.time() print(after - before) stopCluster(cl)
  • 23. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 new 6 R(snow) 17.35 7 R 23.28 8 R(apply) 54.16
  • 24. Rの高速化手法④ ffパッケージ Rはメモリを逼迫させる。 →データはハードディスクから、必要に応じてメモリに ロードしたい。 *ベクトル、行列、因子などのデータ: ffパッケージ *行列のデータ: bigmemoryパッケージ しかも上記の2つは並列化まであわせてやってくれる!
  • 25. Rの高速化手法④ ffパッケージ before <- proc.time() library(ff) library(snowfall) sfInit(parallel=TRUE, cpus=4,type=“MPI") 4つのクラスターを生成 num_steps <-ff(vmode="integer",1:10000000,length=10000000) step <- 1.0 / 10000000 ff,stepを各クラス sfLibrary(ff) ターにエクスポート sfExport("step") menseki <- function(A){ x <- (A - 0.5) * step y <- 4.0 / (1.0 + x * x) snowfall内でのsapply()である、 return(y*step) sfSapply()を使う } pi <- sum(sfSapply(num_steps,menseki)) print(pi) after <- proc.time() print(after - before)
  • 26. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 new 6 R(ff) 17.00 7 R(snow) 17.35 8 R 23.28 9 R(apply) 54.16 snowより若干速いくらい
  • 27. Rの高速化手法⑤ バイトコンパイラーの使用 あらかじめ構文解析後の関数にしておく。 人が見ても何しているのかわからない機械語に近い形式になる。 バイトコンパイル後 list(.Code, list(7L, GETVAR.OP, 1L, LDCONST.OP, 2L, SUB.OP, 3L, GETVAR.OP, 4L, MUL.OP, 5L, ①library(“compiler”) SETVAR.OP, 6L, POP.OP, LDCONST.OP, ②menseki2 <- cmpfun(menseki) 7L, LDCONST.OP, 8L, GETVAR.OP, 6L, ③disassemble(menseki2) GETVAR.OP, 6L, MUL.OP, 9L, ADD.OP, 10L, DIV.OP, 11L, SETVAR.OP, 12L, POP.OP, GETVAR.OP, バイトコンパイル前 12L, GETVAR.OP, 4L, MUL.OP, 13L, RETURN.OP), list({ menseki <- function(A){ x <- (A - 0.5) * step x <- (A - 0.5) * step y <- 4/(1 + x * x) y <- 4.0 / (1.0 + x * x) return(y * step) }, A, 0.5, A - 0.5, step, (A - 0.5) * step, x, 4, 1, return(y*step) x * x, 1 + } x * x, 4/(1 + x * x), y, y * step))
  • 28. Rの高速化手法⑤ バイトコンパイラーの使用 before <- proc.time() library("compiler") num_steps <- 1:10000000 step <- 1.0 / 10000000 menseki <- function(A){ x <- (A - 0.5) * step y <- 4.0 / (1.0 + x * x) return(y*step) } menseki2 <- cmpfun(menseki) バイトコンパイル pi <- sum(sapply(num_steps,menseki2)) print(pi) after <- proc.time() print(after - before)
  • 29. 結果 ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 6 R(ff) 17.00 7 R(snow) 17.35 8 R 23.28 new 9 R(compiler + apply) 41.14 10 R(apply) 54.16
  • 30. 並列化と組み合わせ ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 new 6 R(compiler + ff) 14.41 new 7 R(compiler + snow) 15.11 8 R(ff) 17.00 9 R(snow) 17.35 10 R 23.28 11 R(compiler + apply) 41.14 12 R(apply) 54.16
  • 31. Rの高速化手法⑥ R-2.14.0 最新VerのR-2.14.0はかなり速い。 *全ての基本パッケージの関数があらかじめ、バ イトコンパイルされているとか R-2.4.0 30.1s R-2.8.0 30.8s R-2.9.10 31.7s R-2.10.0 31.7s R-2.11.0 24.2s 64bit化 R-2.12.1 23.28s R-2.13.2 24.4s ? R-2.14.0 ? バイトコンパイル化 の順
  • 32. 最終結果 ランク 言語 実行時間(s) 1 C 0.15 2 R(プログラム修正) 0.30 3 Python 5.19 4 Perl 5.59 5 Ruby 9.12 6 R(compiler + ff) 14.41 7 R(compiler + snow) 15.11 8 R(ff) 17.00 9 R(snow) 17.35 new 10 R(2.14.0) 22.01 11 R 23.28 12 R(compiler + apply) 41.14 13 R(apply) 54.16
  • 33. 時間の関係でできなかった 高速化手法 • Revolution R インストール時にコア数を勝手に調べて、マルチコア対応に計算を実行してくれる新型R (Windows、Redhat用)。普通のRより2〜3倍速いという噂。 • RCCコンパイラー R→C++に変換できます(Windows、Linux用)。 • RDBMSの利用 Rでリレーショナルデータベース(MySQL,PostgreSQL,RODBC,MiniSQL)がいじれます。 • Hadoop,Mapreduceの利用 http://www.slideshare.net/holidayworking/rmapreduce (以前のTokyo.Rのスライド) • R+クラウドコンピューティング segue: アマゾンがやっているlapply関数を並列に計算してくれるサービス(Mac,Linux用)。 http://code.google.com/p/segue/