2016-07-05 68 views
0

我已經寫了一個python腳本,它將輸入作爲一個目錄並列出該目錄中的所有文件,然後解壓縮這些文件中的每一個,並對其進行一些額外的處理。代碼非常簡單,使用os.listdir(目錄)中的文件列表,並對列表中的每個文件解壓縮,然後在其上執行一系列不同的系統調用。我的問題是,是否有任何方法可以使循環執行並行或使代碼運行更快利用CPU上的核心,以及可能是什麼,下面是一些演示代碼來描述我的目標是優化:使python腳本處理大量文件更快

files = os.listdir(directory) 
for file in files: 
    os.system("tar -xvf %s" %file) 
    os.system("Some other sys call") 
    os.system("One more sys call") 

編輯:系統調用是唯一可能的方式,因爲我使用某些CLI定製的實用工具,希望輸入作爲解壓縮文件,因此解壓縮。

+0

? –

+0

編輯問題 –

+0

'import multiprocessing'應該更好地使用內核,因爲所有的檔案都是分開處理的。人們也可以考慮tar模塊...而不是系統調用,調用tar ...以及信息有多快,你的實現,如果它需要加速或好奇心驅動的問題。如果大部分工作是在「shell」中完成的,由於減少了I/O,管道而不是單獨的系統調用通常也是一種節省時間的選擇。 – Dilettant

回答

0

注意os.system()是同步的,即python在進入下一行之前等待任務完成。

下面是我在Windows 7和Python上做的簡化2.66
您應該可以根據自己的需要輕鬆修改它。
1.創建和運行,因爲我想在並行
2.運行每個任務的過程後,他們都開始我恨不得你爲什麼要使用系統調用來完成

import win32api, win32con, win32process, win32event 

def CreateMyProcess2(cmd): 
    ''' create process width no window that runs a task or without arguments''' 
    si   = win32process.STARTUPINFO() 
    info = win32process.CreateProcess(
     None,  # AppName 
     cmd,  # Command line 
     None,  # Process Security 
     None,  # Thread Security 
     0,   # inherit Handles? 
     win32process.NORMAL_PRIORITY_CLASS, 
     None,  # New environment 
     None,  # Current directory 
     si)  # startup info 
    return info[0] 
# info is tuple (hProcess, hThread, processId, threadId) 

if __name__ == '__main__' : 
    handles  = [] 

    cmd = 'cmd /c "dir/w"' 
    handle = CreateMyProcess2(cmd) 
    handles.append(handle) 

    cmd = 'cmd /c "path"' 
    handle = CreateMyProcess2(cmd) 
    handles.append(handle) 

    rc = win32event.WaitForMultipleObjects(
     handles, # sequence of objects (here = handles) to wait for 
     1,  # wait for them all (use 0 to wait for just one) 
     15000) # timeout in milli-seconds 
    print rc 
    # rc = 0 if all tasks have completed before the time out