メイン

rpy アーカイブ

2012年10月05日

[R][rpy2] rpy2::forのパフォーマンス

Rのforステートメントは激しく遅いので有名です.この繰り返しをpython側でやっちゃったらどうなるかなっと

# R内で直接まわす
now = datetime.datetime.now()
robjects.r('nn <- 100000;for( ii in 1:nn ){ x <- 4}')
print datetime.datetime.now() - now

# pythonでまわす ①
func = robjects.r('function(x) x <- 4')
now = datetime.datetime.now()
for ii in range(100000):
    tmp = func(4.0)

print datetime.datetime.now() - now

# pythonでまわす ②
func = robjects.r('func <- function(x) x <- 4')
print robjects.r.func
now = datetime.datetime.now()
for ii in range(100000):
    tmp = robjects.r.func(4.0)

print datetime.datetime.now() - now
>


うん、遅い.
たぶん、forステートメント自体はpythonのが早いんだろうけど、forの中身を評価するのにおそらく時間がかかっているのだろうと思う.
low-level interfaceを使用してforの中身の評価をすぐ始められるようにすればいいのかな.

2012年10月06日

[R][rpy2] rpy2::forのパフォーマンス ふたたび

何をしているのか、そのうち思い出します

import rpy2.rinterface as ri
ri.initr()
eval = ri.baseenv["eval"]
expression = ri.parse('x <- 4')

# pythonでまわす ①
now = datetime.datetime.now()
for ii in range(100000):
    tmp = eval(expression)

print datetime.datetime.now() - now
>

2012年10月07日

[R][rpy2] pry2::parse

parseを使ってみる.

import rpy2.rinterface as ri
ri.initr()
expression = ri.parse('1 + 2')
len(expression)
len(expression[0])
ri.str_typeint(expression[0][0].typeof)
'SYMSXP'
tuple(expression[0][1])
(1.0,)
tuple(expression[0][2])
(2.0,)

ということなのだけど、これを実行するにはどうしたらいいのかなと悩んでいた.
>>> ri.baseenv["eval"]
>>> eval = ri.baseenv["eval"]
>>> eval(expression)
>>> print eval(expression)
>>> eval(expression)[0]
3.0
>>> print eval(expression)[0]
3.0
>>> print eval(expression)[1]
Traceback (most recent call last):
File "", line 1, in
IndexError: Index out of range.
>>> print eval(expression)[0]
3.0

>>> expression = ri.parse('3 + 2')
>>> print eval(expression)[0]
5.0
>>> print eval(expression)
<rpy2.rinterface.SexpVector - Python:0xb7fae1c0 / R:0x86da7b0>
>>> tuple(eval(expression))
(5.0,)

これを使用してforを試してみることにする.

2012年10月08日

[R][rpy2] pass-by-value-paradigm

Pass-by-value paradigmという、内容が良くわからなかった.

An infamous example is when the column names for a matrix are changed, bringing a system to its knees when the matrix is very large, as the whole matrix ends up being copied

こういうこと?
あまりにも悪名高い振る舞いが、matrixオブジェクトのカラム名を変更しようとするときである.Rはmatrixオブジェクトのすべてをコピーしようとするため、matrixが非常に大きい場合、システムが崩壊する.

pythonでやる場合は直接変更するので、matrixオブジェクトがコピーされることは無いよと.

2012年10月09日

[R][rpy2] rpy2::データをアサインする

以下のようにデータを付値すると、リストになってしまう.

>>> robjects.globalenv["a"] = [3,2,1]
>>> print robjects.r.a
[[1]]
[1] 3 

[[2]]
[1] 2

[[3]]
[1] 1


以下のようにするがよさげ
>>> print robjects.IntVector([3,2,1])
[1] 3 2 1

>>> robjects.globalenv["a"] = robjects.IntVector([3,2,1])
>>> print robjects.r.a
[1] 3 2 1

>>> print robjects.r('a')
[1] 3 2 1

>>> print robjects.r('a[1]')
[1] 3


下のようなやり方もあるけど、データがばかでかい場合にはあまりよろしくない
>>> robjects.Vector([3,2,1]).r_repr()
'list(3L, 2L, 1L)'
>>> tmp = robjects.Vector([3,2,1]).r_repr()
>>> tmp
'list(3L, 2L, 1L)'
>>> robjects.r('a <- %s' % tmp)
>>> print robjects.r('a')
[[1]]
[1] 3

[[2]]
[1] 2

[[3]]
[1] 1


時間を計測
import datetime
testdata = range(100000,0,-1)
roInt = robjects.IntVector(testdata)
now = datetime.datetime.now()
tmp = roInt.r_repr()
robjects.r('a <- %s' % tmp)
print datetime.datetime.now() - now

now = datetime.datetime.now()
robjects.globalenv["a"] = roInt
print datetime.datetime.now() - now
>

2012年10月10日

[R][rpy2] rpy2

RをPythonに組み込むことができる.それにインターフェースもちゃんとしてる.こいつはクールだぜ.

rpy2
ドキュメント : rpy2.robjects

>>> import rpy2.robjects as robjects
>>> robjects.r
<rpy2.robjects.R object at 0xa189ccc>
>>> print robjects.r
<rpy2.robjects.R object at 0xa189ccc>
platform: i686-pc-linux-gnu
arch: i686
os: linux-gnu
system: i686, linux-gnu
status:
major: 2
minor: 15.1
year: 2012
month: 06
day: 22
svn rev: 59600
language: R
version.string: R version 2.15.1 (2012-06-22)
nickname: Roasted Marshmallows
>>> robjects.r.pi
<FloatVector - Python:0xa189e0c / R:0xaa2dff0>
[3.141593]
>>> robjects.r.pi[0]
3.141592653589793
>>> robjects.r.letters
<StrVector - Python:0xa19228c / R:0xa87e2a0>
['a', 'b', 'c', ..., 'x', 'y', 'z']
>>> robjects.r.letters[0:]
<StrVector - Python:0xa19290c / R:0xa87e3d0>
['a', 'b', 'c', ..., 'x', 'y', 'z']
>>> robjects.r.letters[0]
'a'
>>> robjects.r.letters[1]
'b'
>>> robjects.r('pi')
<FloatVector - Python:0xa192aec / R:0xaa2dff0>
[3.141593]
>>> robjects.r('x <- 4')
<FloatVector - Python:0xa192e6c / R:0xaa2ddd0>
[4.000000]
>>> robjects.r('x')
<FloatVector - Python:0xa192dec / R:0xaa2ddd0>
[4.000000]
>>> robjects.r['x']
<FloatVector - Python:0xa1929ec / R:0xaa2ddd0>
[4.000000]
>>> [ee for ee in robjects.r.letters]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

About rpy

ブログ「[R言語] Rのお部屋::あーるのおへや[別館]」のカテゴリ「rpy」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはpypyです。

次のカテゴリはその他です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

広告

Powered by
Movable Type 3.37