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("結(jié)束")
# 時間復雜度: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
結(jié)束

算法

算法的概述

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

算法的五大特性:

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

第二次嘗試:

提示: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("結(jié)束")
# 時間復雜度: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
結(jié)束

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

算法的效率衡量

時間復雜度和大O記法

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

時間復雜度的幾條基本計算規(guī)則

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

python內(nèi)置類型性能分析

timeit模塊

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

class timeit,Timer(stmt="pass",setup='pass',timer= <.timer function> )

  • Timer是測量小段代碼執(zhí)行速度的類。

  • stmt參數(shù)是要測試的代碼語句(statment);

  • setup參數(shù)是運行代碼時需要的設置;

  • timer參數(shù)是一個定時器函數(shù),與平臺有關(guān)。

timeit.Timer.timeit(number=1000000)

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

下面是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] # 這個做過優(yōu)化,速度比相加快的多
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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天是什么日子 起床:7:00 就寢:12:00 天氣:陰 心情:平和無感 任務清單 昨日完成的任務,最重要的三件...
    莫仁離伊閱讀 291評論 0 0
  • 開始困難一點。加油吧。感冒咳嗽咽喉痛還是沒好,唉。
    松小鼠姐姐閱讀 122評論 0 0
  • 小芽 致我的兒子 你象風兒吹過 調(diào)皮地弄亂我的發(fā) 拿下我的發(fā)卡 說媽媽還是長頭發(fā)好看 你象雨點落下 瞬間淚水跌落在...
    一片舟閱讀 286評論 0 0
  • 2016年,六月七號,再一次經(jīng)過高考考場,戒備森嚴著,蘇珊還是止不住地,潸然淚下!高考過去已經(jīng)整整五年,五年的時間...
    原木C閱讀 940評論 0 0

友情鏈接更多精彩內(nèi)容