偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

嫌Python太慢?并行運算Process Pools三行代碼給你4倍提速!

開發(fā) 開發(fā)工具
Python是適用于處理數(shù)據(jù)或者把重復任務自動化的絕佳編程語言。有幾個網(wǎng)頁日志要抓取或者一百萬張圖片要調(diào)整?沒問題!你幾乎總是能找到對應的Python庫幫助您輕松完成任務。

 

[[201332]]

 

 

作者 | Adam Geitgey

 

 

編譯 | 元元、Lisa、Saint、Aileen

 

Python絕對是處理數(shù)據(jù)或者把重復任務自動化的***編程語言。要抓取網(wǎng)頁日志?或者要調(diào)整一百萬張圖片?總有對應的Python庫讓你輕松完成任務。

然而,Python的運營速度一直飽受詬病。默認狀態(tài)下,Python程序使用單個CPU的單個進程。如果你的電腦是最近十年生產(chǎn)的,多數(shù)情況下會有4個及以上CPU核。也就是說,當你在等程序運行結束的時候,你的計算機有75%或者更多的計算資源都是空置的!

讓我們來看看如何通過并行運算充分利用計算資源。多虧有Python的concurrent.futures模塊,僅需3行代碼就可以讓一個普通程序并行運行。

一般情況下的Python運行

比如說我們有一個文件夾,里面全是圖片文件,我們想給每一張圖片創(chuàng)建縮略圖。

下面的短程序中我們使用Python自帶的glob 函數(shù)獲取一個包含文件夾中所有圖片文件的列表,并用Pillow圖片處理庫獲取每張圖片的128像素縮略圖。

一般情況下的Python運行

這個程序遵循很常見的數(shù)據(jù)處理模式:

  1. 從您想處理的一系列文件(或其他數(shù)據(jù))開始
  2. 編寫一個處理一個數(shù)據(jù)的輔助函數(shù)
  3. 用for循環(huán)調(diào)動輔助函數(shù),一個一個的去處理數(shù)據(jù)

讓我們用1000張圖片來測試這個程序,看看運行時間是多少。

程序運行時間8.9秒,但是計算機的運算資源占用了多少呢?

讓我們再跑一次程序,同時查看活動監(jiān)視器:

計算機有75%空置,這是為什么呢?

問題在于我的計算機有4個CPU核,但是Python只用了其中一個核。即便我的程序把那個CPU核完全占滿,但是其他3個CPU核什么也沒干。我們需要想辦法把整個程序的工作量分成4份然后平行運行。所幸Python可以做到這一點!

讓我們來試試并行運算

下面是實現(xiàn)并行運算的一個方法:

  1. 把Jpeg圖片文件列表分成4個部分。
  2. 同時跑四個Python解釋器。
  3. 讓四個解釋器分別處理一部分圖片文件。
  4. 匯總四個解釋器的結果得到最終結果。

四個Python程序分別在4個CPU上運行,跟之前在1個CPU運行相比大概可以達到4倍的速度,對不對?

好消息是Python可以幫我們解決并行運算麻煩的部分。我們僅需要告訴 Python我們想要運行什么函數(shù)以及我們希望工作分成多少份,其他部分留給Python。我們只需要修改三行代碼。

首先,我們需要導入concurrent.futures庫。這個庫是Python自帶的:

然后,我們需要告訴 Python另外啟動4個Python實例。我們通過創(chuàng)建Process Pool來傳達指令:

默認設置下,上面的代碼會給計算機的每一個CPU創(chuàng)建一個Python進程,所以如果您的計算機有4個CPU,就會開啟4個Python進程。

***一步是讓Process Pool 用這4個進程在數(shù)據(jù)列表中執(zhí)行我們的輔助函數(shù)。我們可以把我們之前的for循環(huán)替代為:

新代碼是調(diào)用executor.map()函數(shù)

executor.map() 函數(shù)調(diào)用時需要輸入輔助函數(shù)和待處理的數(shù)據(jù)列表。這個函數(shù)幫我們完成所有麻煩的工作,把列表分成幾個小列表,把小列表分配給每個子進程,運行子進程,以及匯總結果。干得漂亮!

我們也可以得到每次調(diào)用輔助函數(shù)的結果。executor.map()函數(shù)以輸入數(shù)據(jù)順序返回結果。 Python的zip()函數(shù)可以一步獲取原始文件名以及相應結果。

下面是經(jīng)過三步改動之后的程序:

讓我們試著運行一下,看看有沒有縮短運行時間:

2.274秒程序就運行完了!這便是原來版本的4倍加速。運行時間縮短的原因正是我們這次用4個CPU代替了1個CPU。

但是如果您仔細看看,您會看到“用戶(User)”時間大概是接近9秒,如果程序2秒就運行結束了,為什么客戶時間會是9秒?這似乎…有哪里不對?

其實這是因為”用戶”時間是所有CPU時間的總和。我們和上次一樣,用9秒的總CPU

注意:啟用Python進程以及給子進程分配數(shù)據(jù)都會占用時間,因此您不一定能靠這個方法大幅提高速度。如果您處理的數(shù)據(jù)量很大,這里有一篇“設置chunksize參數(shù)的技巧”文章可能可以幫助您:https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor.map。

這種方法總能幫我的程序提速嗎?

當你有一列數(shù)據(jù),并且每個數(shù)據(jù)都可以獨立處理的時候,使用Process Pools是一個好方法。這有一些適合使用并行處理的例子:

  1. 從一系列單獨的網(wǎng)頁服務器日志里抓取數(shù)據(jù)。
  2. 從一堆XML,CSV和JSON文件中解析數(shù)據(jù)。
  3. 對大量圖片數(shù)據(jù)做預處理,建立機器學習數(shù)據(jù)集。

但Process Pools不是***的。使用Process Pool需要在獨立的Python處理過程中將數(shù)據(jù)來回傳遞。如果你正在使用的數(shù)據(jù)不能在處理過程中有效的被傳遞,這種方法就行不通。你處理的數(shù)據(jù)必須是Python知道怎么搞定的類型

(https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled)。

同時,數(shù)據(jù)不會按照一個預想的順序被處理。如果你需要前一步的處理結果來進行下一步驟,這種方法也行不通。

那GIL怎么辦?

你可能聽說過Python有一個全局解釋器鎖(Global Interpreter Lock,),縮寫為GIL。這意味著即使你的程序是多層的,每一層也只有一個Python命令能被執(zhí)行。GIL確保任何時候都只有一個Python線程執(zhí)行。 GIL***的問題就是Python的多線程程序并不能利用多核CPU的優(yōu)勢。

但Process Pools能解決這個問題!因為我們在運行單獨的Python實例,每個實例都有自己的GIL。這樣你就有了真正的并行處理的Python代碼!

不要害怕并行處理!

有了concurrent.futures庫,Python可以讓你簡簡單單地修改腳本,卻能立刻調(diào)用你電腦上所有CPU內(nèi)核開足馬力地運行。不要害怕嘗試。一旦你會用了,它就像寫一個for循環(huán)那樣簡單,但會讓整個程序快很多。

原文:

https://medium.com/@ageitgey/quick-tip-speed-up-your-python-data-processing-scripts-with-process-pools-cf275350163a

【本文是51CTO專欄機構大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號“大數(shù)據(jù)文摘( id: BigDataDigest)”】

     大數(shù)據(jù)文摘二維碼

 

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-06-26 08:37:23

Python數(shù)據(jù)處理編程語言

2021-12-17 12:12:22

Python 開發(fā)數(shù)據(jù)

2018-10-07 05:27:03

Python代碼機器學習

2020-05-06 22:01:52

Excel代碼Python

2018-07-27 09:32:18

Python代碼數(shù)據(jù)

2023-07-31 08:02:28

2009-10-27 09:12:50

Visual Stud

2019-10-09 15:51:45

Python 開發(fā)編程語言

2021-11-18 10:20:22

代碼PDFPython

2021-08-30 15:41:23

代碼開源微軟

2023-08-14 07:42:01

模型訓練

2020-06-09 14:33:15

PythonCython代碼

2020-08-12 09:14:45

Python驗證碼工具

2019-12-25 14:08:50

Pandas數(shù)據(jù)計算

2022-04-09 09:11:33

Python

2018-03-28 14:10:10

GoPython代碼

2022-03-09 14:57:53

Numbapython

2022-06-27 08:42:05

代碼sklearn機器學習

2020-05-20 12:50:32

代碼線性方程開發(fā)

2017-04-13 19:20:18

Python代碼并行任務
點贊
收藏

51CTO技術棧公眾號