2018/02/01
2020/04/14
PythonとR言語のプログラム処理速度を比較!
データ解析でよく使われるプログラミング言語といえば、PythonとRです。データ解析コンペティションkaggleでもプログラミング言語はこの二言語が指定されています。
両者とも解析機能(ライブラリなども含めて)が豊富で、シンプルな記述で複雑な解析を行うことが出来ます。よく比較されるこの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】をお読み下さい。
回帰分析の実行速度
(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でした。
まとめ
今回の結果を表にまとめると以下のようになります。
Python | R言語 | |
---|---|---|
データの読み込み | 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の勝利という結果になりましたね。特にR言語はサイズの大きいデータの読み込みが遅くて、スタートに時間がかかりそうです。ただ、手軽さという点を比較すると、Pythonはデータの読み込みや回帰分析一つするにもライブラリが必要で、Rの方がプログラムは簡潔です。
Recommended