成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 

[[201332]]

 

 

作者 | Adam Geitgey

 

 

編譯 | 元元、Lisa、Saint、Aileen

 

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

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

讓我們來(lái)看看如何通過(guò)并行運(yùn)算充分利用計(jì)算資源。多虧有Python的concurrent.futures模塊,僅需3行代碼就可以讓一個(gè)普通程序并行運(yùn)行。

一般情況下的Python運(yùn)行

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

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

一般情況下的Python運(yùn)行

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

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

讓我們用1000張圖片來(lái)測(cè)試這個(gè)程序,看看運(yùn)行時(shí)間是多少。

程序運(yùn)行時(shí)間8.9秒,但是計(jì)算機(jī)的運(yùn)算資源占用了多少呢?

讓我們?cè)倥芤淮纬绦颍瑫r(shí)查看活動(dòng)監(jiān)視器:

計(jì)算機(jī)有75%空置,這是為什么呢?

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

讓我們來(lái)試試并行運(yùn)算

下面是實(shí)現(xiàn)并行運(yùn)算的一個(gè)方法:

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

四個(gè)Python程序分別在4個(gè)CPU上運(yùn)行,跟之前在1個(gè)CPU運(yùn)行相比大概可以達(dá)到4倍的速度,對(duì)不對(duì)?

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

首先,我們需要導(dǎo)入concurrent.futures庫(kù)。這個(gè)庫(kù)是Python自帶的:

然后,我們需要告訴 Python另外啟動(dòng)4個(gè)Python實(shí)例。我們通過(guò)創(chuàng)建Process Pool來(lái)傳達(dá)指令:

默認(rèn)設(shè)置下,上面的代碼會(huì)給計(jì)算機(jī)的每一個(gè)CPU創(chuàng)建一個(gè)Python進(jìn)程,所以如果您的計(jì)算機(jī)有4個(gè)CPU,就會(huì)開(kāi)啟4個(gè)Python進(jìn)程。

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

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

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

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

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

讓我們?cè)囍\(yùn)行一下,看看有沒(méi)有縮短運(yùn)行時(shí)間:

2.274秒程序就運(yùn)行完了!這便是原來(lái)版本的4倍加速。運(yùn)行時(shí)間縮短的原因正是我們這次用4個(gè)CPU代替了1個(gè)CPU。

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

其實(shí)這是因?yàn)?rdquo;用戶(hù)”時(shí)間是所有CPU時(shí)間的總和。我們和上次一樣,用9秒的總CPU

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

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

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

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

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

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

同時(shí),數(shù)據(jù)不會(huì)按照一個(gè)預(yù)想的順序被處理。如果你需要前一步的處理結(jié)果來(lái)進(jìn)行下一步驟,這種方法也行不通。

那GIL怎么辦?

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

但Process Pools能解決這個(gè)問(wèn)題!因?yàn)槲覀冊(cè)谶\(yùn)行單獨(dú)的Python實(shí)例,每個(gè)實(shí)例都有自己的GIL。這樣你就有了真正的并行處理的Python代碼!

不要害怕并行處理!

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

原文:

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

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

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

 

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

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2019-06-26 08:37:23

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

2018-10-07 05:27:03

Python代碼機(jī)器學(xué)習(xí)

2021-12-17 12:12:22

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

2020-05-06 22:01:52

Excel代碼Python

2023-07-31 08:02:28

2018-07-27 09:32:18

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

2009-10-27 09:12:50

Visual Stud

2019-10-09 15:51:45

Python 開(kāi)發(fā)編程語(yǔ)言

2021-11-18 10:20:22

代碼PDFPython

2021-08-30 15:41:23

代碼開(kāi)源微軟

2023-08-14 07:42:01

模型訓(xùn)練

2020-06-09 14:33:15

PythonCython代碼

2020-08-12 09:14:45

Python驗(yàn)證碼工具

2019-12-25 14:08:50

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

2018-03-28 14:10:10

GoPython代碼

2022-04-09 09:11:33

Python

2022-03-09 14:57:53

Numbapython

2022-06-27 08:42:05

代碼sklearn機(jī)器學(xué)習(xí)

2020-05-20 12:50:32

代碼線(xiàn)性方程開(kāi)發(fā)

2020-08-19 10:30:25

代碼Python多線(xiàn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天天综合久久 | 午夜精品一区二区三区免费视频 | 亚洲高清久久 | 天堂久| 成人精品一区二区三区中文字幕 | www国产成人免费观看视频,深夜成人网 | 99re在线视频 | 久久这里只有精品首页 | 91就要激情 | 亚洲欧美日韩精品久久亚洲区 | 日韩亚洲欧美一区 | 日本人麻豆| 在线视频中文字幕 | 日韩成人专区 | 波多野结衣一区二区 | 高清一区二区三区 | 久久久久久一区 | 日韩免费 | 欧美一区二区三区在线视频 | 亚洲av毛片 | 亚洲精品电影网在线观看 | 男女羞羞免费视频 | 一区二区三区在线播放 | 国产四区 | 久久久无码精品亚洲日韩按摩 | 中文字幕爱爱视频 | 国产免费一区二区三区免费视频 | 国产高清视频在线观看 | 欧美精品在线播放 | 国产精品欧美一区二区三区不卡 | 久久久久久免费精品一区二区三区 | 亚洲精品久 | 五月婷婷亚洲 | 国产精品久久久久久久一区二区 | 国产一区二区三区四区五区3d | 亚洲一区高清 | 美女黄18岁以下禁止观看 | 国产麻豆乱码精品一区二区三区 | 成人免费毛片在线观看 | 亚洲中午字幕 | 成人亚洲视频 |