読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Python と R でクロス集計の速度比較してみるメモ

Python R

(python==3.3.2, R==3.0.2)


R より Python の方が速いらしいので計測して見る。
下記サイトのコードを拝借してやってみた

下準備

data.csv
blood_type,sex
O,F
O,F
O,M
A,M
A,M
B,F
A,F
AB,M
O,F
blue,M
B,M
B,M
O,M
O,M
AB,F
hoge.py
import pandas
data = pandas.read_csv('data.csv')
crosstab = data.pivot_table(rows='sex', cols="blood_type", aggfunc=[len])
print(crosstab)
hoge.r
data <- read.csv("data.csv")
cross <- table(data[,2], data[,1])
print(cross)

速度計測

ipythonの%timeitで速度計ってみる

In [1]: import os

In [2]: %timeit os.system('R --vanilla --slave < hoge.r')
1 loops, best of 3: 363 ms per loop

In [3]: %timeit os.system('python hoge.py')
1 loops, best of 3: 426 ms per loop

あれ? Rの方が速い。データ量が少ないからかな?

データ量を増やしてやってみる

12 から 100,000コくらいで

generate_sample.py
from random import choice

blood_type = ["A", "B", "O", "AB"]
sex = ["M", "F"]
max_num = 100000

print("blood_type,sex")
print("\n".join([
    "{blood_type},{sex}".format(
        blood_type=choice(blood_type),
        sex=choice(sex)
    ) for _ in range(max_num)]
))
data.csv
$ python generate_sample.py > data.csv

速度計測(100,000)

In [50]: %timeit os.system('R --vanilla --slave < hoge.r')
1 loops, best of 3: 509 ms per loop

In [51]: %timeit os.system('python hoge.py')
1 loops, best of 3: 487 ms per loop

お、逆転した。Pythonが速くなった。

速度計測(1,000,000)

In [62]: %timeit os.system('R --vanilla --slave < hoge.r')
1 loops, best of 3: 1.36 s per loop

In [63]: %timeit os.system('python hoge.py')
1 loops, best of 3: 1.03 s per loop

当たり前だけど差が広がった。
Pythonの方が速いという事で、Pythonのお仕事くださいm(__)m