[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
結束
算法
算法的概述
算法是獨立存在的一種解決問題的方法和思想
算法的五大特性:
- 輸入: 0個或多個輸入
- 輸出: 1個或多個輸出
- 有窮性: 有限步驟,可接受時間范圍內完成
- 確定性: 每一步具有確定的意義,不會出翔二義性
- 可行性: 能不能實現
第二次嘗試:
提示: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記法
時間復雜度:算法進行了多少個基本操作(即花費了多少個時間單位),漸進函數
時間復雜度的幾條基本計算規則
- 基本操作,即只有常數項,時間復雜度為O(1)
- 順序結構,時間復雜度按加法進行計算
- 循環結構,時間復雜度按乘法計算
- 分支結構,時間復雜度取最大值
- 判斷一個算法的效率時,往往只需要關注操作數量的最高次項,其他次要項和常數項可以忽略
- 在沒有特殊說明時,我們所分析的算法的時間復雜度都是指最壞時間復雜度
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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
