在這些時候,我可以附和着笑,項目經理是決不責備的。而且項目經理見了孔乙己,也每每這樣問他,引人發笑。孔乙己自己知道不能和他們談天,便只好向新人說話。有一回對我說道,“你學過數據結構嗎?”我略略點一點頭。他說,“學過數據結構,……我便考你一考。斐波那契數列用Python怎樣寫的?”我想,討飯一樣的人,也配考我么?便回過臉去,不再理會。孔乙己等了許久,很懇切的說道,“不能寫罷?……我教給你,記着!這些字應該記着。將來做項目經理的時候,寫賬要用。”我暗想我和項目經理的等級還很遠呢,而且我們項目里也用不到斐波那契數列;又好笑,又不耐煩,懶懶的答他道,“誰要你教,不是f(n) = f(n-1)+f(n-2)嗎?”孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲着辦公桌,點頭說,“對呀對呀!……斐波那契數列在python中有四種寫法,你知道么?”我愈不耐煩了,努着嘴走遠。孔乙己剛拿出筆記本電腦,想要寫幾段程序,見我毫不熱心,便又嘆一口氣,顯出極惋惜的樣子。
斐波那契數列的定義
f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2)
CODE
本次介紹Python中斐波那契數列的四種寫法,第一種寫法比較常見,第二種寫法也比較常見.(魯迅聽了想打人).咳咳.第一種依賴於遞歸,第二種依賴與循環,前兩種算法都是可以在幾乎所有編程語言里面都能都快速移植的.我們先從這兩種介紹
第一種:遞歸
# 遞歸 def Fibonacci_Recursion_tool(n): if n <= 0: return 0 elif n == 1: return 1 else: return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2) def Fibonacci_Recursion(n): result_list = [] for i in range(1, n + 1): result_list.append(Fibonacci_Recursion_tool(i)) return result_list
性能比較
這里我們使用time函數進行計時.並使用numpy類庫保存到文件中
def Test_Fibonacci(n, list): t1 = time.clock() Fibonacci_Recursion(n) t2 = time.clock() l1 = t2 - t1 t1 = time.clock() Fibonacci_Loop(n) t2 = time.clock() l2 = t2 - t1 t1 = time.clock() Fibonacci_Yield(n) t2 = time.clock() l3 = t2 - t1 t1 = time.clock() Fibonacci_Matrix(n) t2 = time.clock() l4 = t2 - t1 list.append([l1,l2, l3, l4]) print("第%d次的測試結果為:" % n, [l1,l2, l3, l4]) def Test_Save(times_items, filename): times_list = [] for i in range(1, times_items + 1): Test_Fibonacci(i, times_list) np.savetxt(filename, times_list) def Test_Print(Test_Print_n): print(Fibonacci_Recursion(Test_Print_n)) print(Fibonacci_Loop(Test_Print_n)) print(Fibonacci_Yield(Test_Print_n)) print(Fibonacci_Matrix(Test_Print_n)) times_items = 40 filename = "/home/fonttian/Data/17_DS_AI/Fibonacci/Fibonacci_all.txt" # Test_Save(times_items,filename)
從效果來看第一種效果最差在35以上的運算次數時,耗時就會達到1s,而其他的計算速度則仍然在十的負五次方到負六次方之間,當次數大於1000時,loop的速度開始明顯不足.
而在pow(10000,10000)時,矩陣與yield的計算速度則為
0.27840600000000004
1.6000000000016e-05
看來還是yield性能好一些,但是實際上並不是,因為yield和np.Matrix實際上的運算機制導致,其實在大數量級運算時,各存在一個問題,yield實際上是沒有運算?np.Matrix 則出現了內存溢出(導致的數值錯誤)
不過整體而言,最好的還是yield,這是python出色設計的功勞.
