這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一般程式設計語言效能比較這個網站比較有說服力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如果你的程式邏輯有問題,還是會慢。