摘要:代碼優(yōu)化分享最近看到的關(guān)于代碼優(yōu)化的一些技巧。運(yùn)行結(jié)果合并字符串合并字符串比循環(huán)使用來合并要快。語句的開銷語句有時(shí)候?yàn)榱讼拗扑鼈兊淖饔梅秶蛘吖?jié)省初始化時(shí)間,被卸載函數(shù)內(nèi)部,雖然的解釋器不會(huì)重復(fù)同一個(gè)模塊不會(huì)出錯(cuò),但重復(fù)導(dǎo)入會(huì)影響部分性能。
代碼優(yōu)化Part1
分享最近看到的關(guān)于代碼優(yōu)化的一些技巧。
if 判斷的短路特性對于and,應(yīng)該把滿足條件少的放在前面,這樣當(dāng)對于大量判斷時(shí), 滿足條件少的情況直接回導(dǎo)致其后其他表達(dá)式不會(huì)計(jì)算從而節(jié)約時(shí)間(因?yàn)?False and True 還是 False)
import timeit s1 = """ a = range(2000) [i for i in a if i % 2 ==0 and i > 1900] """ s2 = """ a = range(2000) [i for i in a if i > 1900 and i % 2 ==0] """ print timeit.timeit(stmt=s1, number=1000) print timeit.timeit(stmt=s2, number=1000)
運(yùn)行結(jié)果如下:
? python test6.py 0.248532056808 0.195827960968 # 可以看到s2 表達(dá)式計(jì)算更快, 因?yàn)榇蟛糠智闆r都不滿足 i>1900, 所以這些情況下, i % 2 == 0 也沒有計(jì)算,從而節(jié)約了時(shí)間
同理對于or,把滿足條件多的放在前面。
import timeit s1 = """ a = range(2000) [i for i in a if 10 < i <20 or 1000 < i < 2000] """ s2 = """ a = range(2000) [i for i in a if 1000 < i < 2000 or 10 < i <20] """ print timeit.timeit(stmt=s1, number=1000) print timeit.timeit(stmt=s2, number=1000)
運(yùn)行結(jié)果:
0.253124952316 0.202992200851join 合并字符串
join 合并字符串比循環(huán)使用 + 來合并要快。
import timeit s1 = """ a = [str(x) for x in range(2000)] s = "" for i in a: s += i """ s2 = """ a = [str(x) for x in range(2000)] s = "".join(a) """ print timeit.timeit(stmt=s1, number=1000) print timeit.timeit(stmt=s2, number=1000)
運(yùn)行結(jié)果如下:
python test6.py 0.558945894241 0.422435998917while 1 和 while True
在python2.x里, True 和 False 不是保留的關(guān)鍵字,是一個(gè)全局變量,這意味著你可以這樣
>>> True = 0 >>> True 0 >>> if not True: ... print "1" ... 1
所以下面這兩種情況:
import timeit s1 = """ n = 1000000 while 1: n -= 1 if n <= 0: break """ s2 = """ n = 1000000 while True: n -= 1 if n <= 0: break """ print timeit.timeit(stmt=s1, number=100) print timeit.timeit(stmt=s2, number=100)
運(yùn)行結(jié)果如下:
? python test6.py 5.18007302284 6.84624099731
因?yàn)槊看闻袛?while True 的時(shí)候, 先要去找到True的值。
在python3.x里, True 變成了關(guān)鍵字參數(shù),所以上述兩種情況就一樣了。
cProfile, cStringIO 和 cPickle使用C語言的版本寫的擴(kuò)展要比原生的要快。cPickle vs pickle 如下:
import timeit s1 = """ import cPickle import pickle n = range(10000) cPickle.dumps(n) """ s2 = """ import cPickle import pickle n = range(10000) pickle.dumps(n) """ print timeit.timeit(stmt=s1, number=100) print timeit.timeit(stmt=s2, number=100)
運(yùn)行結(jié)果如下:
? python test6.py 0.182178974152 1.70917797089合理使用生成器 區(qū)別
使用()得到的是一個(gè)generator對象,所需要的內(nèi)存空間與列表的大小無關(guān),所以效率會(huì)高一些。
import timeit s1 = """ [i for i in range (100000)] """ s2 = """ (i for i in range(100000)) """ print timeit.timeit(stmt=s1, number=1000) print timeit.timeit(stmt=s2, number=1000)
結(jié)果:
? python test6.py 5.44327497482 0.923446893692
但是對于需要循環(huán)遍歷的情況:使用迭代器效率反而不高,如下:
import timeit s1 = """ ls = range(1000000) def yield_func(ls): for i in ls: yield i+1 for x in yield_func(ls): pass """ s2 = """ ls = range(1000000) def not_yield_func(ls): return [i+1 for i in ls] for x in not_yield_func(ls): pass """ print timeit.timeit(stmt=s1, number=10) print timeit.timeit(stmt=s2, number=10)
結(jié)果如下:
? python test6.py 1.03186702728 1.01472687721
所以使用生成器是一個(gè)權(quán)衡的結(jié)果,對于內(nèi)存、速度綜合考慮的結(jié)果。
xrange在python2.x里xrange 是純C實(shí)現(xiàn)的生成器,相對于range來說,它不會(huì)一次性計(jì)算出所有值在內(nèi)存中。但它的限制是只能和整型一起工作:你不能使用long或者float。
import 語句的開銷import語句有時(shí)候?yàn)榱讼拗扑鼈兊淖饔梅秶蛘吖?jié)省初始化時(shí)間,被卸載函數(shù)內(nèi)部,雖然python的解釋器不會(huì)重復(fù)import同一個(gè)模塊不會(huì)出錯(cuò),但重復(fù)導(dǎo)入會(huì)影響部分性能。
有時(shí)候?yàn)榱藢?shí)現(xiàn)懶加載(即使用的時(shí)候再加載一個(gè)開銷很大的模塊),可以這么做:
email = None def parse_email(): global email if email is None: import email ... # 這樣一來email模塊僅會(huì)被引入一次,在parse_email()被第一次調(diào)用的時(shí)候。參考資源:
https://wiki.python.org/moin/...
http://blog.csdn.net/zhoudaxi...
https://www.ibm.com/developer...
NEXT ctypes文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44282.html
摘要:的批評者聲稱性能低效執(zhí)行緩慢,但實(shí)際上并非如此嘗試以下個(gè)小技巧,可以加快應(yīng)用程序。使用或者機(jī)器語言擴(kuò)展包來執(zhí)行關(guān)鍵任務(wù)能極大改善性能。但是如果你把求值的結(jié)果放入一個(gè)變量中,就能提高程序的性能。 Python是一門非??岬恼Z言,因?yàn)楹苌俚腜ython代碼可以在短時(shí)間內(nèi)做很多事情,并且,Python很容易就能支持多任務(wù)和多重處理。 Python的批評者聲稱Python性能低效、執(zhí)行緩慢,...
此專欄文章是對力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...
摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...
摘要:使用或機(jī)器語言的外部功能包處理時(shí)間敏感任務(wù),可以有效提高應(yīng)用的運(yùn)行效率。關(guān)鍵在于,優(yōu)化循環(huán)方案是提高應(yīng)用程序運(yùn)行速度的上佳選擇。此外,關(guān)于交叉編譯是否為提高運(yùn)行效率的最佳方法還存在討論的空間。在使用交叉編譯器時(shí),記得確保它支持你所用的版本。 Python 是一門優(yōu)秀的語言,它能讓你在短時(shí)間內(nèi)通過極少量代碼就能完成許多操作。不僅如此,它還輕松支持多任務(wù)處理,比如多進(jìn)程。 不喜歡 Pyt...
閱讀 1419·2021-11-24 10:20
閱讀 3662·2021-11-24 09:38
閱讀 2305·2021-09-27 13:37
閱讀 2211·2021-09-22 15:25
閱讀 2283·2021-09-01 18:33
閱讀 3501·2019-08-30 15:55
閱讀 1793·2019-08-30 15:54
閱讀 2100·2019-08-30 12:50