LoginSignup
1
0

More than 5 years have passed since last update.

フィボナッチにeval(a,b)使ってみたけどはやいわけじゃなかった

Last updated at Posted at 2013-12-15

はい。
参考先サイト様のものよりやや早く終わるのですがよく分からなかったけどメモ書きは残して置かなければで。
参考先さま
http://d.hatena.ne.jp/sakurai_youhei/20130107/1357568535

op.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#from __future__ import print_function
import sys
import io
import re
import math

#### メモリ使用量と動作時間チェック仕込み
from guppy import hpy
import time
start = time.clock()
h = hpy()
#### 仕込みここまで
# 掲載らしい
def fib(n):
    if n < 2: return n
    return fib(n-2) + fib(n-1)

#print fib(50)

def fib2(n):
    a,b=0,1
    return reduce(lambda x,y: x+[x[-1]+x[-2],], xrange(n-1), [a,b])[n]
print fib2(10000)

def fib3(n):
    a,b=0,1
    for i in range(n):
        a,b=b,eval('a+b')
    print a

#print fib3(500000)

#def fib4(n):
#    n+=3
#    f=[(seq.append(seq[i-2] + seq[i-1]), seq[i-2])[1] for seq in [[0, 1]] #for
#            i in range(2, n)]
#    print f[-1]
#print fib4(500000)

def fib5(n):
    a,b=0,1
    for i in range(n):
        a,b=b,a+b
    print a

#print fib5(500000)


#if __name__ == 'main':
#    print(fib(100))


#### メモリ使用量と動作時間出力
end = time.clock()
print (h.heap())
print (end - start)

fib(n)とfib2(n)が先さまで、fib3(n)が私がevalで試してみたパターンです。
eval使っているのは計算結果の取り出し方も違いますし、よくわかりません。わからないのです。

比較結果のようなもの

関数 処理時間 F(3)の値
fib() 0.008658秒 2
fib2() 0.011694秒 2
fib3() 0.011055秒 2
関数 処理時間 F(10)の値
fib() 0.010526秒 55
fib2() 0.008879秒 55
fib3() 0.011909秒 55
関数 処理時間 F(35)の値
fib() 5.782845秒 9227465
fib2() 0.011936秒 9227465
fib3() 0.010569秒 9227465

パターンその1は時間が結構かかってしまうように。。。
まぁ、アレです。計算結果って書く意味ないですし、アホみたいに大きな数字になるので以降は処理速度だけメモします。

関数 処理時間 F(50)の値
fib() 7997.16923秒
fib2() 0.009155秒
fib3() 0.010594秒

パターン1はもう試さなくていいよね。。。。

関数 処理時間 F(10000)の値
fib2() 0.376591秒
fib3() 0.111379秒
fib5() 0.012429秒
関数 処理時間 F(100000)の値
fib2() 215.197792秒
fib3() 1.23247秒
fib5() 0.176561秒
関数 処理時間 F(500000)の値
fib3() 10.064515秒
fib5() 3.950023秒

おまけ
・n=777777 の場合
fib5()
処理速度 9.299923

書式や比較方法が公正でない可能性もあるような。まぁ何パターンか書き方を覚えておいて処理速度を気にしないといけない時にどのパターンが早いかを試してみたりかな。

13/12/15
はい。コメントにもいただきましたa,b=b,a+bでの計測値をfib5()の欄で表へ追記いたしました。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0