忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[287]  [286]  [285]  [284]  [283]  [282]  [281]  [280]  [279]  [278]  [277
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

以前、RをCと連携させることで、特にループ処理の速度を改善させることができることを書いた(記事へのリンク)。しかし、やっぱりCは難しい。さらに、RからCへ渡すことのできる引数の型に制限があるなど、書き方の工夫もそれなりに手強い。

そこで、手っ取り早くループ処理の速度を改善する方法として、pythonと連携させてはどうかと考え、やってみた。pythonとの連携については特別なメソッドが用意されているというわけではない。以下の手順で、強引に連携させる。

1. 特定の計算を行うpythonのスクリプトを書き、結果はファイルに出力させる。
2. Rにおいて、system() 関数を使ってそのpythonスクリプトを走らせ、結果をファイルから読み取る。

system() 関数は、外部プログラムを呼び出すための関数で、引数としてコマンド(文字列)を受け取る。例えば、

system("ls")
とすれば、作業中のディレクトリのファイルリストを出力する(windowsなら system("dir") だろうか)。

したがって、
system("python file.py arg1 arg2")
とすれば、R上からpythonスクリプトを走らせることができる。もちろん好きなだけ引数を渡すことができる。ただし、戻り値を受け取ることはできないので、結果の受け渡しにはファイルを経由する。人に仕事頼むのだが事情があって結果を直接会って話すことができないのに似ている。結果を記したメモを壁に貼っておいてもらうのだ。


処理内容は以前と同じくN*N回の加減の計算。R, Cと連携, pythonと連携の3パターンの計算速度を比較する。
処理に用いたファイル一式はこちら


下のグラフでは、横軸にNを、縦軸に処理にかかる時間をプロットしている(両対数軸)。やはりCとの連携が圧倒的に速い。pythonも健闘していて、Rにやらせるよりはかなり速い。

具体的には、N=10000の場合(つまり、1億回の計算)、R では145秒かかるところを、pythonでは15秒、Cではなんと0.1秒未満で終わらせている。
test.png






















回帰分析の結果:

* C *
log(time) = -20.30163 + 1.93688 * log(N)  

* python *
log(time) = -14.66641 + 1.88273 * log(N)  

* R *
log(time) = -13.99015 + 2.06207 * log(N)  
 

Wald testを行うと、切片についてはすべての組み合わせについて、「等しい」という仮説は5%の有意水準で棄却された(Rとpythonの差はp値0.04くらいで、ぎりぎりだが)。
 
傾きについては、pythonとCの間には有意な差は見られなかった(p=0.156)。
一方、Rと比較したとき、python, Cはそれぞれ傾きが有意に小さい(それぞれp=0.002, 0.000)。



結論:Cほどではないがpythonとの連携もループ処理の速度改善に役立つ。


 
PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Calender
11 2018/12 01
S M T W T F S
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 31
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]