あるページ
http://www.timestretch.com/FractalBenchmark.html
に、いろんなプログラミング言語でマンデルブロ集合を求めるベンチマークがありました。
Pythonはgccより200倍ほど遅いか、ふんふん、と思ってちょっとソースコードをみてみました。
すると、肝心のループのところが、
while True:
i += 1
temp = zr * zi
zr2 = zr * zr
zi2 = zi * zi
zr = zr2 - zi2 + cr
zi = temp + temp + ci
if zi2 + zr2 > BAILOUT:
return i
if i > MAX_ITERATIONS:
return 0
と、少し緩めのコードになっています。多分私なら、
for i in xrange(0, MAX_ITERATIONS):
zr2 = zr * zr
zi2 = zi * zi
zi, zr = zr * zi * 2 + ci, zr2 - zi2 + cr
if zi2 + zr2 > BAILOUT:
return i
return 0
と書くでしょう。
C++やJavaだけやっていた頃の私なら、これくらいの違いなら「まあ賢いコンパイラがよきに計らってくれるから」と気にしないですむのですが、何かと予想外の振る舞いをしてくれるPythonとなるとそうもいきません。
実際、手元のマシンで実行してみると、オリジナル(上のやつ)は、2.07秒、書き換えた方は1.63秒と、かなりの違いが。
いや、Cに比べれば、200倍遅いか160倍遅いかくらいで、五十歩百歩よりもまださが差が小さい、とも言えますけれども。
まあ、スクリプト言語を使っていて、こんなので目くじらたてる方がおかしいのかも知れませんね。頭が固いか。
http://www.timestretch.com/FractalBenchmark.html
に、いろんなプログラミング言語でマンデルブロ集合を求めるベンチマークがありました。
Pythonはgccより200倍ほど遅いか、ふんふん、と思ってちょっとソースコードをみてみました。
すると、肝心のループのところが、
while True:
i += 1
temp = zr * zi
zr2 = zr * zr
zi2 = zi * zi
zr = zr2 - zi2 + cr
zi = temp + temp + ci
if zi2 + zr2 > BAILOUT:
return i
if i > MAX_ITERATIONS:
return 0
と、少し緩めのコードになっています。多分私なら、
for i in xrange(0, MAX_ITERATIONS):
zr2 = zr * zr
zi2 = zi * zi
zi, zr = zr * zi * 2 + ci, zr2 - zi2 + cr
if zi2 + zr2 > BAILOUT:
return i
return 0
と書くでしょう。
C++やJavaだけやっていた頃の私なら、これくらいの違いなら「まあ賢いコンパイラがよきに計らってくれるから」と気にしないですむのですが、何かと予想外の振る舞いをしてくれるPythonとなるとそうもいきません。
実際、手元のマシンで実行してみると、オリジナル(上のやつ)は、2.07秒、書き換えた方は1.63秒と、かなりの違いが。
いや、Cに比べれば、200倍遅いか160倍遅いかくらいで、五十歩百歩よりもまださが差が小さい、とも言えますけれども。
まあ、スクリプト言語を使っていて、こんなので目くじらたてる方がおかしいのかも知れませんね。頭が固いか。