python 隨記

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了,祝他早日找到自己心中的完美語言。

  1. 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如果你的程序邏輯有問題,還是會慢。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容