裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Python で平均値? でも,R より遅い(その2)

2017年11月22日 | ブログラミング

コメントをいただいた

> pythonは標準ではRで言うlistで配列を扱うので, 標準では速度的に不利です。それをRと同じようにベクトル(配列)で扱えるようにするのがnumpyですので,
> numpy.mean(numpy.arange(1,10000000))
> みたいにして比較するなら良いかと思います。
> 上記のpythonの例だと, Rで言うなれば x にたような比較になってしまっています。
> # つまりリスト処理のオーバーヘッドの計測をしてしまっている.

なるほど,遅すぎるとは思いました。

しかし,以下のようにしてみましたが,

>>> import numpy
>>> import time
>>> s = time.time()
>>> numpy.mean(numpy.arange(1,10000001))
5000000.5
>>> print(time.time()-s)
0.1522839069366455

しかしなおかつ,10倍ほど遅い(まあ,1秒以下なんだから,大人げなく目くじら立てるほどでもないが)

なお,重箱の隅突きで申し訳ないが,

numpy.arange(1,10000000)

ではなくて,

numpy.arange(1,10000001)

これも,python のやーーなところ(^_^)

=====

R でリストを使うと遅いだろうという指摘はごもっとも

> options(digits=16)
> system.time({
+     x = as.list(1:10000000)
+     Sum = 0
+     for (i in x) Sum = Sum+x[[i]]
+     print(Sum/length(x))
+ })
[1] 5000000.5
            ユーザ            システム                経過  
0.68999999999999773 0.01800000000000068 0.70499999999992724


でも,list は使わないし...大部分は for のせいだし...

========

追加,上述 python3 の実行結果は,当然ながら,コンソールで逐一入力したものではない(そりゃそうでしょ)

しかし,一行ずつのスクリプトを入力するのではなく,以下のように,全行まとめてやるとずっと速いということがわかった

>>> s=time.time();np.mean(np.arange(1,10000001));print(time.time()-s)
5000000.5
0.03643488883972168

パーサー(?)に一括して渡すかどうかの違いかな?


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« R か Python か? | トップ | 「ストレート・ラインズ」問題 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事