中職電子與信息:《yhon小屋》3-2-3 循環(huán)代碼優(yōu)化技巧_第1頁
中職電子與信息:《yhon小屋》3-2-3 循環(huán)代碼優(yōu)化技巧_第2頁
中職電子與信息:《yhon小屋》3-2-3 循環(huán)代碼優(yōu)化技巧_第3頁
中職電子與信息:《yhon小屋》3-2-3 循環(huán)代碼優(yōu)化技巧_第4頁
中職電子與信息:《yhon小屋》3-2-3 循環(huán)代碼優(yōu)化技巧_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《Python小屋》之三程序控制結構與函數設計3.2循環(huán)結構循環(huán)代碼優(yōu)化技巧學過太極拳的朋友應該聽過一句話:要把拳練好,必把圈練小。一般而言,功夫越深的人外形動作越小,編寫代碼也是同樣的道理。在滿足功能要求的前提下應該追求代碼的短小精悍,而這也是對Python內功的考驗。雖然不至于“兩句三年的,一吟雙淚流”,但確實也是需要經過反復推敲的。有不少人編寫代碼之前沒有經過系統(tǒng)地規(guī)劃,也沒有經過深思熟慮,完全是憑著感覺走,想到哪寫到哪,寫的時候還反復地修改前面的代碼。對于一些小的程序這樣做是可以的,但是對于大型軟件開發(fā),這種“不管黑貓白貓,抓到老鼠就是好貓”的態(tài)度是可怕的。編寫代碼時,不僅要考慮功能,還要考慮性能以及可維護性、可擴展性、可移植性等。雖然現(xiàn)在的計算機配置越來越高,內存越來越大,計算速度越來越快,計算能力越來越強,各種云平臺更是提供了驚人的存儲空間和計算能力,但作為一種美德,還是要合理利用資源,能少用一點資源就省一點,能讓代碼運行更快一點就盡量優(yōu)化一下,同時也能給代碼進行適當“減肥”來增加可讀性。在編寫循環(huán)語句時,應盡量減少循環(huán)內部不必要或無關的計算,將與循環(huán)變量無關的代碼盡可能提取到循環(huán)之外,這樣可以提高代碼的執(zhí)行效率。對于使用多重循環(huán)嵌套的情況,應盡量較少內層循環(huán)中不必要的計算,盡可能的向外提。例如,下面的代碼,第二段明顯比第一段的運行效率高。importtimedigits=(1,2,3,4)start=time.timeOforiinrange(lOOO):result=[]foriindigits:forjindigits:forkindigits:result.append(i**100+j*10+k)print(1#第一段代碼執(zhí)行耗時:{}'.format(time.time()-start))start2=time.timeOforiinrange(lOOO):result=[]foriindigits:i*=100forjindigits:j*=10forkindigits:22result.append(i+j+k)2324print('#第二段代碼執(zhí)行耗時:{}'.format(time.time()-start2))25print(result)2627#第一段代碼執(zhí)行耗時:28#第二段代碼執(zhí)行耗時:2930#[111,112,113,114,121,122,123,124,131,132,133,134,141,142,143,144,211,212,213,214,221,222,223,224,231,232,233,234,241,242,243,244,311,312,313,314,321,322,323,324,331,332,333,334,341,342,343,344,411,412,413,414,421,422,423,424,431,432,433,434,441,442,443,444]代碼塊3.2.3.1另外,在循環(huán)中應盡量引用局部變量,局部變量的查詢和訪問速度比全局變量略快,在使用模塊中的方法時,可以通過將其轉換為局部變量來提高運行速度。例如下面的代碼:importtimeimportmathstart=time.time()foriinrange(10000000):math.sin(i)print('#TimeUsedl^time.timeO-start)loc_sin=math.sinstart=time.timeOforiinrange(lOOOOOOO):13loc_sin(i)1415print('#TimeUsed2:',time.time()-start)1617#我自己的方法loc_sin=math.sinstart=time.timeO20m=map(loc_sin,range(10000000))211=list(m)22print('#TimeUsed3:',time.timeO-start)232426#TimeUsed2:2.652004718780517627#TimeUsed3:2.979605197906494代碼塊雖然速度提高并不是非常多,但是對于某些對實時性要求特別高的應用場景一點點的提高也是有意義的。而實際上,上面這段代碼還有優(yōu)化的空間,大家能想到嗎?本書其他地方介紹過,嘗試著找一下?!短珮O尺寸分毫解》日“功夫先練開展,后練緊湊”。編寫代碼也是同樣的道理,首先要把代碼寫對,保證完全符合功能要求,然后再進行必要的優(yōu)化來提高性能。過早地追求性能優(yōu)化有時可能會帶來災難而浪費大量精力。代碼優(yōu)化牽涉的面非常廣,對程序員的功底要求很高。除了上面介紹的循環(huán)代碼優(yōu)化,第2章和第5章中介紹的內容也涉及一些優(yōu)化的內容。例如,如果經常需要測試一個序列是否包含一個元素應盡量使用字典或集合而不適用列表,連接多個字符串時盡量使用join()方法二不要使用運算符對列表進行元素的插入和刪除操作時應盡量從列表尾部進行,等等。練習:1輸出“水仙花數”所謂水仙花數是指一個3位的十進制數,其各位數字的立方和恰好等于該數本身,例如,153是水仙花數,因為153=1**3+5**3+3**3importtime3I=[]start=time.timeOforiinrange(100,1000):#獲取個位數g=i%10#獲取十位數s=i//10%10#獲取百位數b=i//100sxh=g**3+s**3+b**3ifsxh==i:Lappend(sxh)print('#程序執(zhí)行耗時:^time.timeO-start)print('#程序執(zhí)行結果:{「format。))23#程序執(zhí)行耗時:24#程序執(zhí)行結果:[153,370,371,407]代碼塊練習2:打印九九乘法表1foriinrange(l,10):forjinrange(l,i+1):printC{}*{}=&format。ji*j),end=")print()103*3=9111011114*3=124*4=16122=103=15*4=205=25132=123=18*4=245=306=36142=143=21*4=285=356=427*7=49152=163=24*4=325=406=488*7=568*8=64114*3=124*4=16122=103=15*4=205=25132=123=18*4=245=306=36142=143=21*4=285=356=427*7=49152=163=24*4=325=406=488*7=568*8=64=6416=6416162=183=27*4=365=456=549*7=639*8=72*9=81代碼塊162=183=27*4=365=456=549*7=639*8=72*9=81練習3:求200以內能被17整除的最大整數importtimea=04#實現(xiàn)代碼1start=time.time()foriinrange(l,20000000):ifi%17==0:a=iprint('#TimeUsed1:{J'.formatftime.timeO-start))print('#程序執(zhí)行結果:{}<.format(a))13#實現(xiàn)代碼2start=time.timeOforiinrange(20000000,L-l):ifj%17==0:a=i18break1920print('#TimeUsed2:{J'.formatftime.timeO-start))21printC#程序執(zhí)行結果:{},.format(a))2223#24#程序執(zhí)行結果:1999999025#TimeUsed2:0.026#程序執(zhí)行結果:19999990272829#這個耗時差距有點大哦,,還是實現(xiàn)代碼2比較好啊代碼塊練習4:自定義一個函數,判斷一個數是否為素數importmathdefis_su(x):a=1foriinrange(2,int(math.sqrt(x))+1):ifx%i==0:a=2breakifa==1:print(x「是素數,)else:13print('x={}不是素數[format(x))1415#函數調用1617is_su(9)18#x=9不是素數1920is_su(7)21#7是素數代碼塊拓展知識:math是用于數學計算的標準庫。除了用于平方根函數sqrt()和取整函數ceil(),Python標準庫math還提供了最大公約數gcd(),sin()>asin()等三角函數與反三角函數,弧度與角度轉換函數degrees()和radians。,誤差函數erf()>剩余誤差函數erfc()、伽馬函數gamma(),對函數log()、Iog2()、Iogl0(),階乘函數factorial。,常數pi和e等。練習5雞兔同籠問題。假設共有雞、兔3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論