程序和算法的區別:程序員
算法分析的概念:算法
計算資源指標:編程
運行時間檢測:app
1 # 累計求和程序的運行時間檢測 2 #迭代法 3 import time 4 5 def sum1(n): 6 start = time.time() 7 theSum = 0 8 for i in range(1,n+1): 9 theSum += i 10 end = time.time() 11 return theSum, end - start 12 13 for i in range(5): 14 print('Sum is %d required %10.7f seconds'%sum1(10000))
n = 10000 時,執行5次的結果爲dom
Sum is 50005000 required 0.0000000 seconds Sum is 50005000 required 0.0009980 seconds Sum is 50005000 required 0.0000000 seconds Sum is 50005000 required 0.0000000 seconds Sum is 50005000 required 0.0009968 seconds
n = 100000 時, 執行5次的結果爲編程語言
Sum is 5000050000 required 0.0049877 seconds Sum is 5000050000 required 0.0049853 seconds Sum is 5000050000 required 0.0049860 seconds Sum is 5000050000 required 0.0049872 seconds Sum is 5000050000 required 0.0049863 seconds
n = 1000000時,執行5次的結果爲函數
Sum is 500000500000 required 0.0528579 seconds Sum is 500000500000 required 0.0518231 seconds Sum is 500000500000 required 0.0528951 seconds Sum is 500000500000 required 0.0519009 seconds Sum is 500000500000 required 0.0527823 seconds
1 # 累計求和程序的運行時間檢測 2 # 利用高斯求和公式的無迭代算法 3 import time 4 5 def sum2(n): 6 start = time.time() 7 theSum = (n * (n+1)) / 2 8 end = time.time() 9 return theSum, end - start 10 11 for i in range(5): 12 print('Sum is %d required %10.7f seconds'%sum2(10000))
n = 10000,100000,1000000時,執行5次的結果時間均相同,爲0.0000000 seconds性能
比較:ui
算法時間度量指標:spa
數量級函數(Order of Magnitude)
常見的大O數量級函數:
1 #解法1:逐字檢查 2 3 def anagramSolution1(s1, s2): 4 alist = list(s2) 5 pos1 = 0 6 stillOK = True 7 while pos1 < len(s1) and stillOK: 8 pos2 = 0 9 found = False 10 while pos2 < len(alist) and not found: 11 if s1[pos1] == s2[pos2]: 12 found = True 13 else: 14 pos2 = pos2 + 1 15 if found: 16 alist[pos2] = None 17 else: 18 stillOK = False 19 pos1 = pos1 + 1 20 return stillOK 21 22 print(anagramSolution1('abcd','cabd'))
1 #解法2:排序比較 2 3 def anagramSolution2(s1, s2): 4 alist1 = list(s1) 5 alist2 = list(s2) 6 7 alist1.sort() 8 alist2.sort() 9 pos = 0 10 matches = True 11 while pos < len(s1) and matches: 12 if alist1[pos] == alist2[pos]: 13 pos = pos + 1 14 else: 15 matches = False 16 return matches 17 18 print(anagramSolution2('abcde','edcba'))
1 #解法4:計數比較 2 3 def anagramSolution4(s1, s2): 4 c1 = [0] * 26 5 c2 = [0] * 26 6 for i in s1: 7 pos = ord(i) - ord('a') 8 c1[pos] = c1[pos] + 1 9 for j in s2: 10 pos = ord(j) - ord('a') 11 c2[pos] = c2[pos] + 1 12 k = 0 13 stillOK = True 14 while k < 26 and stillOK: 15 if c1[k] == c2[k]: 16 k = k + 1 17 else: 18 stillOK = False 19 return stillOK 20 21 print(anagramSolution4('abcde','edcba'))
一、列表list和字典dict的對比:
二、4種生成前n個整數列表的方法性能比較
1 #4種生成前n個整數列表的方法性能比較 2 from timeit import Timer 3 4 def test1(): 5 l = [] 6 for i in range(1000): 7 l = l + [i] 8 9 def test2(): 10 l = [] 11 for i in range(1000): 12 l.append(i) 13 14 def test3(): 15 l = [i for i in range(1000)] 16 17 def test4(): 18 l = list(range(1000)) 19 20 t1 = Timer('test1()','from __main__ import test1') #建立一個Timer對象,指定須要反覆運行的語句和只須要運行一次的「安裝語句」 21 print('concat %f seconds\n' % t1.timeit(number=10000)) #調用Timer對象的timeit方法,其中能夠指定反覆運行多少次 22 23 t2 = Timer('test2()','from __main__ import test2') 24 print('append %f seconds\n' % t2.timeit(number=10000)) 25 t3 = Timer('test3()','from __main__ import test3') 26 print('comprehension %f seconds\n' % t3.timeit(number=10000)) 27 t4 = Timer('test4()','from __main__ import test4') 28 print('list range %f seconds\n' % t4.timeit(number=10000))
concat 14.517047 seconds append 0.859504 seconds comprehension 0.517713 seconds list range 0.127913 seconds
三、list.pop的計時試驗
# -*- coding: utf-8 -*- """ Created on Thu Oct 17 20:30:27 2019 @author: wu """ #list.pop的計時試驗,比較pop()和pop(0)兩種方法 from timeit import Timer import timeit import numpy as np import matplotlib.pyplot as plt pop0 = timeit.Timer('x.pop(0)','from __main__ import x') popend = timeit.Timer('x.pop()','from __main__ import x') print('pop(0) pop()') l1 = [] l2 = [] for i in range(1000000,10000001,100000): x = list(range(i)) pt = popend.timeit(number=100) l1.append(pt) x = list(range(i)) pz = pop0.timeit(number=100) l2.append(pz) print('%15.5f,%15.5f' % (pz,pt)) j = np.arange(1000000,10000001,100000) plt.plot(j,l1,label='pop') plt.plot(j,l2,label='pop0') plt.xlabel('n') plt.ylabel('time(s)') plt.legend() plt.show()
四、list和dict的in操做對比
1 #驗證list中檢索一個值,以及dict中檢索一個值的對比 2 import timeit 3 import random 4 import numpy as np 5 import matplotlib.pyplot as plt 6 7 l1,l2 = [],[] 8 n = [] 9 for i in range(10000,1000001,20000): 10 t = timeit.Timer('random.randrange(%d) in x'%i,'from __main__ import random,x') 11 x = list(range(i)) 12 lst_time = t.timeit(number=100) 13 l1.append(lst_time) 14 x = {j:None for j in range(i)} 15 d_time = t.timeit(number=100) 16 l2.append(d_time) 17 print('{},{:10.3f},{:10.3f}'.format(i,lst_time,d_time)) 18 19 for i in range(10000,1000001,20000): 20 n.append(i) 21 22 plt.plot(n,l1,'go-',label='list') 23 plt.plot(n,l2,'r*-',label='dict') 24 plt.xlabel('n') 25 plt.ylabel('time') 26 plt.legend() 27 plt.show() 28