Python性能提升的一些技巧(持續更新)
一般編程語言性能比較這個網站比較有說服力http://benchmarksgame.alioth.debian.org/u64q/ruby.html,現在的情況是python的速度在比較列表編程語言中屬于墊底的,但是這并不是說python不可取,pytthon慢到不能工作,通過一些簡單的優化和編碼規范python的速度還是不錯的,整天掛在嘴邊python性能不行的都是小白,你要做的系統需要百萬并發嗎?需要誤差在10毫秒內的實時交易嗎?需要千萬級別服務器端口掃描嗎?需要DDOS級別的壓力測試嗎?需要幾個小時內一億次的弱密碼爆破嗎?如果你需要,一億級別爆破和生產環境中的10000QPS個人都用python+c擴展的方式實現過,我可以幫你。
其實絕大多是場景python都能很好的工作,一些對性能要求比較高的場景通過python+c擴展的形式都是可以搞定的,而且省時省力。
以前群里總有個成員成天埋怨,python性能怎么差,自己用起來怎么費力,而不去尋找性能瓶頸在哪兒怎么去做優化。要記住,自己菜逼,怪編程語言是沒有用的,這就像蹲坑拉屎,便秘拉不出來,說馬桶這個地方地球吸引力太小,聽說后來那位朋友去學scala了,還有人說他去學golang了,祝他早日找到自己心中的完美語言。
- python的編碼規范
- 用生成器和列表推導式
- 字符串連接如果數量在3個或3個以內,直接用+號,超過3個,用format或者join,join最好,但format和join差別不是很大
- 不要寫遞歸代碼,尾遞歸也不行,改成循環的形式
- tuple能解決問題就不要用list,同樣set能解決問題就不要用dict,但是dict和list相比,dict速度飛快,就是內存占用大。但是不要刻意去把list轉為tuple。
- 函數能用局部變量,就不要用全局變量
- 交換變量用pythonic的方式,a,b=b,a就這樣
- map有時候可以代替循環,這個時候應該毫不猶豫的使用map
- 在循環內部盡量減少不必要的非循環步驟
- 用while 1別用while True
- 多個變量值比較的時候可以用a<b<c,a<b<c比a<b and b<c效率更高
- 計算x的y次冪用x**y,別用pow,難讀速度還慢
- cpu密集計算別用python,即使要用,也要選擇numpy之類的庫,最好把cpu密集部分改成C代碼,然后ctypes調用,cpu密集部分也不推薦cython,總之C擴展>numpy=cython>python
有些規范和語言無關,就是用C如果你的程序邏輯有問題,還是會慢。