干貨技巧!不需要任何工具,10個(gè)案例讓Python執(zhí)行速度飛速提升
雖然有很多的第三方庫(kù)可以幫助提升Python的運(yùn)行速度,但是使用起來(lái)非常的麻煩。今天,小編想從程序編寫(xiě)的角度,來(lái)提升程序的運(yùn)行速度。
1.巧妙的利用Python的數(shù)據(jù)類型
在Python程序中,對(duì)于list列表進(jìn)行 for i in list1的操作時(shí),其時(shí)間復(fù)雜度為O(n),而對(duì)于set進(jìn)行for i in set1的操作,時(shí)間復(fù)雜度為O(1)。所以在程序的執(zhí)行時(shí)間上,就會(huì)出現(xiàn)非常大的差距。
2.利用迭代器來(lái)替代列表
利用迭代器來(lái)代替列表,已經(jīng)逐漸的成為了Python編程者使用的一種方法,利用迭代器的操作,不僅可以節(jié)省時(shí)間,更重要的是可以節(jié)省大量的內(nèi)存空間,上圖中,利用列表的操作需要占用大約8M的內(nèi)存,但是迭代器只需要88個(gè)字節(jié)。
3.利用局部變量代替全局變量
上圖程序中,全局的變量z放入到函數(shù)myFunc中,局部變量的執(zhí)行時(shí)間要小于全局變量,因此程序執(zhí)行的時(shí)間也大大的縮短。
4.避免“點(diǎn)”操作
上圖中可以看到,calculateSqrtWithDot函數(shù)和calculateSqrt函數(shù)唯一的區(qū)別在于是否通過(guò)點(diǎn)操作來(lái)調(diào)用sqrt函數(shù)。每當(dāng)我們點(diǎn)操作來(lái)調(diào)用函數(shù)時(shí),就會(huì)觸發(fā)特定的方法,例如,__getattribute__() 和__getattr__(),這樣的方法會(huì)調(diào)用字典操作,從而帶來(lái)時(shí)間的消耗,因此在程序調(diào)用第三方庫(kù)時(shí)候,可以盡量使用from xx import xx的方法來(lái)進(jìn)行調(diào)用。
5.避免不必要的類抽象
在類中,盡量不要去使用裝飾器,描述符等操作來(lái)包裝程序,這會(huì)給程序的運(yùn)行帶來(lái)負(fù)擔(dān),所以如果沒(méi)有必要的話,就不要去這樣包裝程序。
6.避免沒(méi)有意義的數(shù)據(jù)拷貝
上圖的程序中,list6是一次沒(méi)有意義的數(shù)據(jù)拷貝,不僅造成了程序運(yùn)行時(shí)間的損耗,而且造成了內(nèi)存資源的浪費(fèi)。
7.更改值時(shí)避免使用臨時(shí)變量
上述的程序中,temp的臨時(shí)變量是不需要的,使用臨時(shí)變量temp造成了程序運(yùn)行時(shí)間的增加。
8.字符串變量的操作
當(dāng)字符串str1和str2操作使用“+”號(hào)操作時(shí),Python解釋器將申請(qǐng)內(nèi)存空間,將數(shù)據(jù)str1和str2分別復(fù)制到新的內(nèi)存空間中去,所以當(dāng)進(jìn)行N次的字符串”+“操作時(shí),將會(huì)生成N-1個(gè)中間的結(jié)果,并且每個(gè)中間結(jié)果都會(huì)復(fù)制到新的內(nèi)存空間中。
當(dāng)使用join函數(shù)時(shí),join函數(shù)將會(huì)一次性計(jì)算所需的所有內(nèi)存空間,然后申請(qǐng)內(nèi)存空間,并將所有的字符串元素復(fù)制到申請(qǐng)的內(nèi)存中去。
9.巧用if判斷
在運(yùn)用if進(jìn)行判斷時(shí),常用的有兩種方式。 1 if ...and...。 2 if... or ...。為了節(jié)省程序的運(yùn)算時(shí)間,當(dāng)進(jìn)行if x and y的判斷時(shí),x需要是False可能性比較高的判斷條件。當(dāng)進(jìn)行 if x or y的判斷時(shí),x需要是True可能性比較高的判斷條件。
10.利用for循環(huán)代替while循環(huán)
上圖的程序中,可以看到,同樣的功能利用for循環(huán)來(lái)替代while循環(huán),for循環(huán)的速度要快于while循環(huán)。
總結(jié)
通過(guò)以上的10個(gè)小的案例,我們沒(méi)有利用任何的第三方庫(kù)或者是裝飾器,單純的從程序優(yōu)化的角度來(lái)提升了Python程序的運(yùn)行速度。大家可以借鑒上述的十個(gè)小的案例,在日常的程序編寫(xiě)過(guò)程中提升程序的運(yùn)行速度。