前言
python現在已經被廣泛使用了,它效率高,平常做一些簡單的實驗,處理一些數據都可以使用python。
我寫這篇文章的目的,是想和大家分享下提升python性能的小技巧,這些技巧在工作和學習中算是非常實用了。接下來文字和簡明扼要,直接告訴大家如何高性能使用python,不會涉及到基礎知識沒比如元組和列表的區別等,需要讀者有一定的python基礎和算法基礎。
列表和元組的選擇
他倆的區別我就不再贅述,就使用情況來看,列表是動態的,元組是靜態的,想必大家都很喜歡使用列表吧。
但是因為列表的超額分配,列表會占用額外的內存的空間,而且初始化列表的時間大約是初始化元組的5倍,因此給大家的建議是,凡是需要存儲不會改變的事物,就是用元組吧,或者是說只要在適用的情況下,能用元組就用元組。
迭代器和生成器
迭代器和生成器算是python的一大特色了,迭代器和生成器可以簡單理解為,需要迭代的內容不需要全部在內存中,只有在迭代完一個的時候才去生成另外一個。所以,迭代器和生成器一大好處就是節省內存。舉個例子,統計10GB文本中單詞的個數,顯然不能把10GB文件都讀到內存中,那么我們可以寫如下代碼:
with open("test.txt","r") as fr:
# 千萬不要寫成 data = fr.readlines(),這樣就全部讀到內存中了
for line in fr:
pass # 統計這一行單詞的個數
上面的例子非常簡單,只是用來告訴大家這么一個思想,只要會yield和iter基本就能應付日常工作了。
大規模矩陣運算
這一小節可能更適合從事機器學習工作的人。如果你需要進行大規模的矩陣計算,比如計算5萬個向量和另外5萬個向量的余弦值,請使用numpy庫,一個高效的矩陣運算庫,凡是需要進行大規模矩陣運算和矢量計算,用numpy就對了。 numpy也是很多使用技巧的,比如盡可能對矩陣使用就地操作來節省內存,即:arr1 += arr2而不是arr1 = arr1 + arr2。
多進程
大家都知道因為全局鎖的原因,python無法真正並行,不過我們可以使用多進程模塊multiprocessing來實現多進程,直接看代碼吧:
import random
import time
from multiprocessing import Pool
def f(x1,x2):
time.sleep(random.randint(3,15))
return x1+x2
if __name__ == "__main__":
pool = Pool(4)
res = []
for i in range(6):
res.append(pool.apply_async(f,args=(i,i)))
pool.close()
pool.join()
res = [i.get() for i in res]
print(res)
其它小技巧
- 高效迭代字典,請使用for k,v in dict.items()
- 高效連接大量字符串,請使用join函數
- 需要頻繁判斷某個元素是否在集合里,請使用字典或者set
- 能用python內置函數就要用,效率會更高一些,比如filter函數
- 多使用局部變量,局部變量檢索更快,盡量少使用global關鍵字
- 迭代pandas的dataframe時,使用df.itertuples()會快很多
- 無限循環使用while 1
- 善於去找各種高效的第三方包,python的包真的非常多,當自己當算寫一個復雜的功能時,先去搜索一下有沒有類似的包
總結
上面基本是我工作中常用到小技巧,python的優點主要是可快速上手和測試結果,可以用來快速驗證想法,真正去把想法去作為一個工程實現,還是要用java等語言。