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

自分のマシン上でpython走らせたときのパフォーマンス(2)

pythonの自PCにおけるパフォーマンスの記事を書いた後、showyouさんも同じような測定をしてくれました
しかし、異なる測定結果が出てきてしまいました。
ソースコードを公開されていたので、こちらも公開して比較することにします。

あと、最初に言っておきますが今回の測定は全て測定回数1回のブランクテストのレベルなので、厳密な結果として見ないようお願いします。
あくまで傾向把握ということで。

ソースコード

1〜Nまでの和


1/N〜N/Nまでの和(全てfloat)


乱数生成


ランダムな配列のソート


配列へのappend


[0]*nによる配列の生成


追試

showyouさんのコードを使って、自分の環境でも試してみました。

測定内容 ループ回数 時間[sec]
1〜Nまでの和 10^7 3.16
1/N〜N/Nまでの和(全てfloat) 10^7 5.61
乱数生成 10^7 2.91
ランダムな配列のソート 10^6 2.20
配列へのappend 10^7 2.58
[0]*nによる配列の生成 10^8 1.04

考察

ソースコードの違い
  • 全体に共通する違いとして、こちらは psyco 使っているが、あちらは使っていない。
  • もう一つの全体共通の違いとして、こちらは xrange() でループを回しているがあちらは range()。
  • パフォーマンスの差分がやたら大きかった乱数生成だが、こちらは random.randint() を使い、あちらは random.random() を使っている。
追試結果
  • 和の計算に関しては id:showyou さんの結果と比べて1.6倍ほど遅いが、これはマシンスペックの差と思われる。
  • その割には配列周りの測定ではほとんど差が見られず、むしろ配列生成などこちらの方がいい結果出ていたりする。謎。

ソースを修正して再度測定

psyco を使わない
測定内容 ループ回数 時間[sec]
1〜Nまでの和 10^7 4.15
1/N〜N/Nまでの和(全てfloat) 10^7 11.29
乱数生成 10^7 34.09
ランダムな配列のソート 10^6 1.32
配列へのappend 10^7 3.42
[0]*nによる配列の生成 10^8 0.73
psyco 使用、xrange() を range() に
測定内容 ループ回数 時間[sec]
1〜Nまでの和(*1) 10^7 4.33
1/N〜N/Nまでの和(全てfloat) 10^7 11.13
乱数生成 10^7 22.53
ランダムな配列のソート(*2) 10^6 1.27
配列へのappend 10^7 4.07
[0]*nによる配列の生成(*2) 10^8 0.76

(*1) 1〜Nまでの和は、10^8では性能劣化した(50sec)。他の測定では全てリニアに伸びていた(約43〜45sec)
(*2) for ループは一重だけのため、ほとんど意味なし

randint→randomに
測定内容 ループ回数 時間[sec]
乱数生成 10^7 4.23

データ一覧

測定結果の単位は全て[sec]。

測定内容 ループ回数 最初のコード psycoなし range() showyou 追試 random()
1〜Nまでの和 10^7 4.55 4.15 4.33 3.16 -
1/N〜N/Nまでの和(全てfloat) 10^7 12.24 11.29 11.13 5.61 -
乱数生成 10^7 22.92 34.09 22.53 2.91 4.23
ランダムな配列のソート 10^6 1.29 1.32 1.27 2.20 -
配列へのappend 10^7 4.33 3.42 4.07 2.58 -
[0]*nによる配列の生成 10^8 0.85 0.73 0.76 1.04 -

考察(2)

psyco ほとんど意味がない

というかむしろ悪化してます。しかし random は異様に速くなってるし、google code jam の過去問で psyco を使ったときは明らかに速かったし、上位の python 使いは psyco を普通に使ってたりもするわけで、このあたりどういう条件下で速くなるのかはよく調べる必要がありそうです。

xrange と range

そんなに違いはない気がします。xrange の方がメモリを食わない(と公式に書いてある)のでとりあえずこのままでいいかな?

randint

遅すぎて話にならないです。

しかしまだ謎はいっぱい

他の部分については id:showyou さんと自分のコードにそれほど違いはないように見えますが実際はパフォーマンスに差が出てます。なんでかはよくわからないですが、この辺のことをもう少し知らないといけない気がします。