Python高性能編程


前言

python現在已經被廣泛使用了,它效率高,平常做一些簡單的實驗,處理一些數據都可以使用python。
我寫這篇文章的目的,是想和大家分享下提升python性能的小技巧,這些技巧在工作和學習中算是非常實用了。接下來文字和簡明扼要,直接告訴大家如何高性能使用python,不會涉及到基礎知識沒比如元組和列表的區別等,需要讀者有一定的python基礎和算法基礎。

列表和元組的選擇

他倆的區別我就不再贅述,就使用情況來看,列表是動態的,元組是靜態的,想必大家都很喜歡使用列表吧。
但是因為列表的超額分配,列表會占用額外的內存的空間,而且初始化列表的時間大約是初始化元組的5倍,因此給大家的建議是,凡是需要存儲不會改變的事物,就是用元組吧,或者是說只要在適用的情況下,能用元組就用元組。

迭代器和生成器

迭代器和生成器算是python的一大特色了,迭代器和生成器可以簡單理解為,需要迭代的內容不需要全部在內存中,只有在迭代完一個的時候才去生成另外一個。所以,迭代器和生成器一大好處就是節省內存。舉個例子,統計10GB文本中單詞的個數,顯然不能把10GB文件都讀到內存中,那么我們可以寫如下代碼:

with open("test.txt","r") as fr:
    # 千萬不要寫成 data = fr.readlines(),這樣就全部讀到內存中了
    for line in fr:
        pass # 統計這一行單詞的個數

上面的例子非常簡單,只是用來告訴大家這么一個思想,只要會yielditer基本就能應付日常工作了。

大規模矩陣運算

這一小節可能更適合從事機器學習工作的人。如果你需要進行大規模的矩陣計算,比如計算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)

其它小技巧

  1. 高效迭代字典,請使用for k,v in dict.items()
  2. 高效連接大量字符串,請使用join函數
  3. 需要頻繁判斷某個元素是否在集合里,請使用字典或者set
  4. 能用python內置函數就要用,效率會更高一些,比如filter函數
  5. 多使用局部變量,局部變量檢索更快,盡量少使用global關鍵字
  6. 迭代pandas的dataframe時,使用df.itertuples()會快很多
  7. 無限循環使用while 1
  8. 善於去找各種高效的第三方包,python的包真的非常多,當自己當算寫一個復雜的功能時,先去搜索一下有沒有類似的包

總結

上面基本是我工作中常用到小技巧,python的優點主要是可快速上手和測試結果,可以用來快速驗證想法,真正去把想法去作為一個工程實現,還是要用java等語言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM