Python算法引入

[TOC]

這裏主要是算法的介紹以及一些判斷算法好壞的標準和方式

引入

如果a+b+c = 1000,且a^2 + b^2 = c^2,如何求出所有a,b,c可能的組合?

第一次嘗試:

import time
print("開始")
start_time = time.time()
for a in range(1001):
    for b in range(1001):
        for c in range(1001):
            if a + b + c==1000 and a ** 2+b ** 2 == c ** 2:
                print("a,b,c:%d,%d,%d" % (a, b, c))

end_time = time.time()
print("time:{}".format(end_time - start_time))
print("結束")
# 時間複雜度:T(n) = n^3 *2
開始
a,b,c:0,500,500
a,b,c:200,375,425
a,b,c:375,200,425
a,b,c:500,0,500
time:140.17622900009155
結束

算法

算法的概述

算法是獨立存在的一種解決問題的方法和思想

算法的五大特性:

  1. 輸入: 0個或多個輸入
  2. 輸出: 1個或多個輸出
  3. 有窮性: 有限步驟,可接受時間範圍內完成
  4. 確定性: 每一步具有確定的意義,不會出翔二義性
  5. 可行性: 能不能實現

第二次嘗試:

提示:c=1000-a-b

import time
print("開始")
start_time = time.time()
for a in range(1001):
    for b in range(1001):
        c = 1000 - a - b
        if a ** 2+b ** 2 == c ** 2:
            print("a,b,c:%d,%d,%d" % (a, b, c))

end_time = time.time()
print("time:{}".format(end_time - start_time))
print("結束")
# 時間複雜度:T(n) = n^2 *3
開始
a,b,c:0,500,500
a,b,c:200,375,425
a,b,c:375,200,425
a,b,c:500,0,500
time:1.0204615592956543
結束

解決一個問題有多個算法,每個算法的效率還是有差距的,如何判斷算法的效率呢?

算法的效率衡量

時間複雜度和大O記法

時間複雜度:算法進行了多少個基本操作(即花費了多少個時間單位),漸進函數

時間複雜度的幾條基本計算規則

  1. 基本操作,即只有常數項,時間複雜度爲O(1)
  2. 順序結構,時間複雜度按加法進行計算
  3. 循環結構,時間複雜度按乘法計算
  4. 分支結構,時間複雜度取最大值
  5. 判斷一個算法的效率時,往往只需要關注操作數量的最高次項,其他次要項和常數項可以忽略
  6. 在沒有特殊說明時,我們所分析的算法的時間複雜度都是指最壞時間複雜度

python內置類型性能分析

timeit模塊

timeit模塊可以用來測試一小段Python代碼的執行速度。

class timeit,Timer(stmt="pass",setup='pass',timer= <.timer function> )
  • Timer是測量小段代碼執行速度的類。
  • stmt參數是要測試的代碼語句(statment);
  • setup參數是運行代碼時需要的設置;
  • timer參數是一個定時器函數,與平臺有關。

timeit.Timer.timeit(number=1000000)

Timer類中測試語句執行速度的對象方法。number參數是測試代碼時的測試次數,默認爲1000000次。方法返回執行代碼的平均耗時,一個float類型的秒數。

下面是timeit模塊的使用方式

from timeit import Timer   
def t1():
    li1 = []
    for i in range(10000):
        li1.append(i)

def t2():
    li = []
    for i in range(10000):
        # li= li+[i]  # 兩個列表相加放到一個新的列表中
        li += [i] # 這個做過優化,速度比相加快的多
def t3():
    li = [i for i in range(10000)]
    
def t4():
    li = list(range(10000))
    
def t5():
    li = []
    for i in range(10000):
        li.extend([i])  # 放到li列表中
        
def t6_end():
    li1 = []
    for i in range(10000):
        li1.append(i)  # 在列表最後加元素

def t6_start():
    li1 = []
    for i in range(10000):
        li1.insert(0,i)  # 在列表最前面加元素
        
        
timer = Timer("t1()","from __main__ import t1")
print("t1",timer.timeit(1000))
timer = Timer("t2()","from __main__ import t2")
print("t2",timer.timeit(1000))
timer = Timer("t3()","from __main__ import t3")
print("t3",timer.timeit(1000))
timer = Timer("t4()","from __main__ import t4")
print("t4",timer.timeit(1000))
timer = Timer("t5()","from __main__ import t5")
print("t5",timer.timeit(1000))
timer = Timer("t6_start()","from __main__ import t6_start")
print("t6_start",timer.timeit(1000))
timer = Timer("t6_end()","from __main__ import t6_end")
print("t6_end",timer.timeit(1000))
t1 0.8016083359998447
t2 211.04629018700052
t3 0.43422231000022293
t4 0.17026640999938536
t5 1.0775756929997442
t6_start 0.7481699620002473
t6_end 25.572036152000692

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章