PythonとR言語のプログラム処理速度を比較!

 2018/02/01    2018/02/02    Python    

データ解析でよく使われるプログラミング言語といえば、PythonとRです。両者とも解析機能(ライブラリなども含めて)が豊富で、シンプルな記述で複雑な解析を行うことが出来ます。よく比較されるこの2言語ですが、今回は「処理速度」という点にフォーカスして記事にいたしました。

処理速度の計測方法ですが、RもPythonも両方

処理にかかった時間 = 終了時刻 - 開始時刻

としています。処理時間の計測法はこちら→Python3でプログラムの処理速度を計測する方法

実行環境

パソコン:MacBook Pro 13-inch,2 GHz Intel Core i5,メモリ8 GB 1867 MHz LPDDR3
Rのバージョン:R 3.3.2
Pythonのバージョン:Python 3.6.2

データの読み込み速度

まずはデータの読み込み速度を比べてみます。今回使うデータは、771.8MBのcsv形式のものです。

Rの場合

startTime = Sys.time() #開始時刻

#処理
df = read.csv("LargeData.csv",fileEncoding="cp932")

endTime = Sys.time() #終了時刻

print(endTime - startTime) #処理時間を表示

Rの結果は、4.216412分でした

system.time()関数を使った場合は、

system.time(read.csv("LargeData.csv",fileEncoding="cp932"))

#結果
#   ユーザ   システム       経過  
#   225.890      5.707    235.510 

こちらの単位は秒です。

Pythonの場合(pandasを利用)

import time #timeモジュールのインポート
import pandas as pd #pandasのインポート

stratTime = time.time() #プログラムの開始時刻

#処理
df = pd.read_csv("LargeData.csv")

endTime = time.time() #プログラムの終了時刻

print(endTime - stratTime) #処理時間を表示

Pythonの結果は、29.296931982040405秒でした。

ちなみに、Pythonは容量が大きいファイルを読み込むとき、low_memory=Falseをオプションに設定することでメモリを効率よく利用します。今回は設定してなかったので次のような警告が出てしましました。pandasでファイルを読み込む時に使えるテクニックをまとめたページはこちら→pandasでcsvファイルをデータフレームとして読み込む【Python3】

sys:1: DtypeWarning: Columns (119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913) have mixed types. Specify dtype option on import or set low_memory=False.

ちなみに、low_memory=Falseにした場合は、47.98824501037598秒と遅くなりました

 

pythonの方がRより約8倍早いという結果になりました。次はこの読み込んだデータを使った処理の速度を比べていきます。

基本的な統計量の計算速度

合計値や最大値、標準偏差などの基本的な統計量の計算速度を比較します。使うのは先ほど読み込んだデータの(1から数えた場合の)2列目で、4桁の数値が86881行にわたって羅列してあります。

合計値、R言語

startTime = Sys.time() #開始時刻

sum(df[,2])

endTime = Sys.time() #終了時刻

print(endTime - startTime) #処理時間を表示

結果は、0.01039505秒でした。

合計値、Python

stratTime = time.time() #プログラムの開始時刻

#処理
print(df.iloc[:,1].sum())

endTime = time.time() #プログラムの終了時刻

print(endTime - stratTime) #処理時間を表示

結果は、0.0012249946594238281秒でした。

最大値、R言語

startTime = Sys.time() #開始時刻

max(df[,2])

endTime = Sys.time() #終了時刻

print(endTime - startTime) #処理時間を表示

結果は、0.01114488秒でした。

最大値、Python

stratTime = time.time() #プログラムの開始時刻

#処理
print(df.iloc[:,1].max())

endTime = time.time() #プログラムの終了時刻

print(endTime - stratTime) #処理時間を表示

import pdb;pdb.set_trace()

結果は、0.00360107421875秒でした。

標準偏差、R言語

startTime = Sys.time() #開始時刻

sd(df[,2])

endTime = Sys.time() #終了時刻

print(endTime - startTime) #処理時間を表示

結果は、0.03360891秒でした。

標準偏差、Python

stratTime = time.time() #プログラムの開始時刻

#処理
print(df.iloc[:,1].std())

endTime = time.time() #プログラムの終了時刻

print(endTime - stratTime) #処理時間を表示

結果は、0.002671957015991211秒でした。

※Pythonの方はnumpy配列の記述法を使っています。numpyについて詳しくは、numpyの何がすごいのか?【Python3】をお読み下さい。

to-kei

回帰分析の実行速度

(1から数えて)1行目を説明変数、2行目を目的変数として単回帰分析を行う速度を比較します。

R言語

startTime = Sys.time() #開始時刻

#処理
lm(df[,c(3,2)])

endTime = Sys.time() #終了時刻

print(endTime - startTime) #処理時間を表示

結果は0.09516501秒でした。

Python(sklearnとnumpyを利用)

stratTime = time.time() #プログラムの開始時刻

#処理
X = np.array(df.iloc[:,[1]])
Y = np.array(df.iloc[:,2])
clf = linear_model.LinearRegression()
clf.fit(X,Y)

endTime = time.time() #プログラムの終了時刻

print(endTime - stratTime) #処理時間を表示

結果は、0.009157896041870117でした。

まとめ

今回の結果を表にまとめると以下のようになります。

 PythonR言語
データの読み込み29秒(low_memory=Flase時48秒)4.2分
合計値(sum)
0.001秒0.01秒
最大値(max)0.01秒0.036秒
標準偏差(std)0.002秒0.03秒
回帰分析0.009秒0.09秒

私の環境では、Pythonの方がR言語よりも3~10倍くらい早いという結果になりました。他にも色々比較するべき要素はあるかと思いますが、速度だけをみるならPythonの方に軍配が上がりそうですね。ただ、Pythonはデータの読み込みや回帰分析一つするにもライブラリが必要で、Rの方がプログラムは簡単です。

個人的には、比較的小さなデータをサクッと解析するならR言語、大きなデータをしっかり解析したいときはPythonを使っています。

  • 関連コンテンツ

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA