1. 程式人生 > >用了python多程序,我跑程式花費的時間縮短了4倍

用了python多程序,我跑程式花費的時間縮短了4倍

應用場景:本人需要對200萬條網頁html格式資料進行清洗,提取文字後將分詞結果寫入資料庫,之前做了一次,大概花費了80多個小時才跑完。機器配置是4核,記憶體8G;開完會領導讓再改點東西重新跑一遍,然後說用多程序或者多執行緒跑,速度快。

本人接觸python不到兩個月,以前也基本不怎麼程式設計,所以這種優化什麼的東西都不懂,只好求助同事。同事告訴我直接看廖雪峰的教程就ok了。先看了一下廖雪峰寫的單個程序程式碼,比較容易懂,但是我需要開四個程序,把我的cpu都佔滿來跑,這樣效率才最大。

所以又看了多程序的例子,並自己實踐了一下:

from multiprocessing import Process
import os from multiprocessing import Pool def run_proc(i): a=i*3 print(a) if __name__=='__main__': p = Pool(4) for i in range(5): p.apply_async(run_proc, args=(i,)) p.close() p.join()

看一下上面程式碼,Pool代表的是一個程序池,裡面寫幾就代表你想跑幾個程序,但是你的cpu是幾核你就只能開幾個程序,而且程序數最好是2的整數倍(同事告訴我的)。檢視cpu核數的方法就是開啟工作管理員,然後效能裡面有幾個小視窗就代表幾核。

我的是四個小視窗,代表四核。按照上面的例子我用四個核來計算run_proc這個函式,然後每個核計算的是一個i值對應的run_proc函式。

接下來到我的實際場景中,我是想從資料庫中讀取200萬條資料並對所有資料進行一系列操作後再寫如資料庫,這裡我採用四核全跑,每個核分配50萬資料來進行:

start = datetime.datetime.now()
p = Pool(4) # 建立程序池
get_data_cmd=['SELECT * FROM 標訊樣本_二百萬 limit 0,500000',
'SELECT * FROM 標訊樣本_二百萬 limit 500000,500000',
'SELECT * FROM 標訊樣本_二百萬 limit 1000000,500000
', 'SELECT * FROM 標訊樣本_二百萬 limit 1500000,500000' ] for cmd in get_data_cmd: # 將每個命令傳入不同的子程序執行相同的程式碼 p.apply_async(con_seg_word, args=(cmd,)) p.close() p.join()

我的方法比較笨,就是將四個不同的sql命令放在一個列表中,然後迴圈讀取列表中的語句來分配給每個核要跑的函式,這樣就ok了,時間大約比之前少了4倍吧。

apply_async這個方法就是你要將你的這四個sql命令給哪個函式,其中arg就是要傳遞進函式的引數。