摘要:代碼優化分享最近看到的關于代碼優化的一些技巧。運行結果合并字符串合并字符串比循環使用來合并要快。語句的開銷語句有時候為了限制它們的作用范圍或者節省初始化時間,被卸載函數內部,雖然的解釋器不會重復同一個模塊不會出錯,但重復導入會影響部分性能。
代碼優化Part1
分享最近看到的關于代碼優化的一些技巧。
if 判斷的短路特性對于and,應該把滿足條件少的放在前面,這樣當對于大量判斷時, 滿足條件少的情況直接回導致其后其他表達式不會計算從而節約時間(因為 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)
運行結果如下:
? python test6.py 0.248532056808 0.195827960968 # 可以看到s2 表達式計算更快, 因為大部分情況都不滿足 i>1900, 所以這些情況下, i % 2 == 0 也沒有計算,從而節約了時間
同理對于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)
運行結果:
0.253124952316 0.202992200851join 合并字符串
join 合并字符串比循環使用 + 來合并要快。
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)
運行結果如下:
python test6.py 0.558945894241 0.422435998917while 1 和 while True
在python2.x里, True 和 False 不是保留的關鍵字,是一個全局變量,這意味著你可以這樣
>>> 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)
運行結果如下:
? python test6.py 5.18007302284 6.84624099731
因為每次判斷 while True 的時候, 先要去找到True的值。
在python3.x里, True 變成了關鍵字參數,所以上述兩種情況就一樣了。
cProfile, cStringIO 和 cPickle使用C語言的版本寫的擴展要比原生的要快。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)
運行結果如下:
? python test6.py 0.182178974152 1.70917797089合理使用生成器 區別
使用()得到的是一個generator對象,所需要的內存空間與列表的大小無關,所以效率會高一些。
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)
結果:
? python test6.py 5.44327497482 0.923446893692
但是對于需要循環遍歷的情況:使用迭代器效率反而不高,如下:
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)
結果如下:
? python test6.py 1.03186702728 1.01472687721
所以使用生成器是一個權衡的結果,對于內存、速度綜合考慮的結果。
xrange在python2.x里xrange 是純C實現的生成器,相對于range來說,它不會一次性計算出所有值在內存中。但它的限制是只能和整型一起工作:你不能使用long或者float。
import 語句的開銷import語句有時候為了限制它們的作用范圍或者節省初始化時間,被卸載函數內部,雖然python的解釋器不會重復import同一個模塊不會出錯,但重復導入會影響部分性能。
有時候為了實現懶加載(即使用的時候再加載一個開銷很大的模塊),可以這么做:
email = None def parse_email(): global email if email is None: import email ... # 這樣一來email模塊僅會被引入一次,在parse_email()被第一次調用的時候。參考資源:
https://wiki.python.org/moin/...
http://blog.csdn.net/zhoudaxi...
https://www.ibm.com/developer...
NEXT ctypes文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44282.html
摘要:的批評者聲稱性能低效執行緩慢,但實際上并非如此嘗試以下個小技巧,可以加快應用程序。使用或者機器語言擴展包來執行關鍵任務能極大改善性能。但是如果你把求值的結果放入一個變量中,就能提高程序的性能。 Python是一門非常酷的語言,因為很少的Python代碼可以在短時間內做很多事情,并且,Python很容易就能支持多任務和多重處理。 Python的批評者聲稱Python性能低效、執行緩慢,...
此專欄文章是對力扣上算法題目各種方法的總結和歸納, 整理出最重要的思路和知識重點并以思維導圖形式呈現, 當然也會加上我對導圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(不用每次都重復看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經知道解題思路和方法, 想進一步加強理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據題號先去力扣看看官方題解, 然后再看本文內容). 關...
摘要:現有的服務器和應用程序服務器相結合并在一個冒泡中運行,無法直接接觸網絡流量,由反向代理服務器提出填鴨式請求。賦予高可用性讓你的反向代理服務器鏡像到在線備份,同時擁有備用的應用程序服務器,讓你的站點高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優化 Python 應用性能。本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。 本文上一篇系: 利用...
摘要:現有的服務器和應用程序服務器相結合并在一個冒泡中運行,無法直接接觸網絡流量,由反向代理服務器提出填鴨式請求。賦予高可用性讓你的反向代理服務器鏡像到在線備份,同時擁有備用的應用程序服務器,讓你的站點高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優化 Python 應用性能。本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。 本文上一篇系: 利用...
摘要:使用或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。關鍵在于,優化循環方案是提高應用程序運行速度的上佳選擇。此外,關于交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。在使用交叉編譯器時,記得確保它支持你所用的版本。 Python 是一門優秀的語言,它能讓你在短時間內通過極少量代碼就能完成許多操作。不僅如此,它還輕松支持多任務處理,比如多進程。 不喜歡 Pyt...
閱讀 1407·2021-11-24 10:20
閱讀 3649·2021-11-24 09:38
閱讀 2294·2021-09-27 13:37
閱讀 2196·2021-09-22 15:25
閱讀 2270·2021-09-01 18:33
閱讀 3488·2019-08-30 15:55
閱讀 1783·2019-08-30 15:54
閱讀 2081·2019-08-30 12:50