<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          就是這么流弊!三行Python代碼,讓數(shù)據(jù)處理速度提高2到6倍

          共 8079字,需瀏覽 17分鐘

           ·

          2020-08-13 21:49

          點(diǎn)擊上方Python知識(shí)圈設(shè)為星標(biāo)

          回復(fù)1024獲取Python資料



          閱讀文本大概需要 3 分鐘


          點(diǎn)擊「閱讀原文」查看pk哥原創(chuàng)精品視頻。

          選自TowardsDataScience

          作者:George Seif

          本文轉(zhuǎn)自機(jī)器之nearhuman2014

          本文可以教你僅使用 3 行代碼,大大加快數(shù)據(jù)預(yù)處理的速度。



          Python 是機(jī)器學(xué)習(xí)領(lǐng)域內(nèi)的首選編程語言,它易于使用,也有很多出色的庫來幫助你更快處理數(shù)據(jù)。但當(dāng)我們面臨大量數(shù)據(jù)時(shí),一些問題就會(huì)顯現(xiàn)……


          在默認(rèn)情況下,Python 程序是單個(gè)進(jìn)程,使用單 CPU 核心執(zhí)行。而大多數(shù)當(dāng)代機(jī)器學(xué)習(xí)硬件都至少搭載了雙核處理器。這意味著如果沒有進(jìn)行優(yōu)化,在數(shù)據(jù)預(yù)處理的時(shí)候會(huì)出現(xiàn)「一核有難九核圍觀」的情況——超過 50% 的算力都會(huì)被浪費(fèi)。在當(dāng)前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時(shí)候,這種情況會(huì)變得更加明顯。



          幸運(yùn)的是,Python 庫中內(nèi)建了一些隱藏的特性,可以讓我們充分利用所有 CPU 核心的能力。通過使用 Python 的 concurrent.futures 模塊,我們只需要 3 行代碼就可以讓一個(gè)普通的程序轉(zhuǎn)換成適用于多核處理器并行處理的程序。


          標(biāo)準(zhǔn)方法


          讓我們舉一個(gè)簡單的例子,在單個(gè)文件夾中有一個(gè)圖片數(shù)據(jù)集,其中有數(shù)萬張圖片。在這里,我們決定使用 1000 張。我們希望在所有圖片被傳遞到深度神經(jīng)網(wǎng)絡(luò)之前將其調(diào)整為 600×600 像素分辨率的形式。以下是你經(jīng)常會(huì)在 GitHub 上看到的標(biāo)準(zhǔn) Python 代碼:


          import glob
          import os
          import cv2


          ### Loop through all jpg files in the current folder 
          ### Resize each one to size 600x600
          for image_filename in glob.glob("*.jpg"):
           ### Read in the image data
           img = cv2.imread(image_filename)

           ### Resize the image
           img = cv2.resize(img, (600600)) 


          上面的程序遵循你在處理數(shù)據(jù)腳本時(shí)經(jīng)常看到的簡單模式:


          1. 首先從需要處理內(nèi)容的文件(或其他數(shù)據(jù))列表開始。

          2. 使用 for 循環(huán)逐個(gè)處理每個(gè)數(shù)據(jù),然后在每個(gè)循環(huán)迭代上運(yùn)行預(yù)處理。


          讓我們?cè)谝粋€(gè)包含 1000 個(gè) jpeg 文件的文件夾上測試這個(gè)程序,看看運(yùn)行它需要多久:


          time python standard_res_conversion.py


          在我的酷睿 i7-8700k 6 核 CPU 上,運(yùn)行時(shí)間為 7.9864 秒!在這樣的高端 CPU 上,這種速度看起來是難以讓人接受的,看看我們能做點(diǎn)什么。


          更快的方法


          為了便于理解并行化的提升,假設(shè)我們需要執(zhí)行相同的任務(wù),比如將 1000 個(gè)釘子釘入木頭,假如釘入一個(gè)需要一秒,一個(gè)人就需要 1000 秒來完成任務(wù)。四個(gè)人組隊(duì)就只需要 250 秒。


          在我們這個(gè)包含 1000 個(gè)圖像的例子中,可以讓 Python 做類似的工作:


          • 將 jpeg 文件列表分成 4 個(gè)小組;

          • 運(yùn)行 Python 解釋器中的 4 個(gè)獨(dú)立實(shí)例;

          • 讓 Python 的每個(gè)實(shí)例處理 4 個(gè)數(shù)據(jù)小組中的一個(gè);

          • 結(jié)合四個(gè)處理過程得到的結(jié)果得出最終結(jié)果列表。


          這一方法的重點(diǎn)在于,Python 幫我們處理了所有棘手的工作。我們只需告訴它我們想要運(yùn)行哪個(gè)函數(shù),要用多少 Python 實(shí)例,剩下的就交給它了!只需改變?nèi)写a。實(shí)例:


          import glob
          import os
          import cv2
          import concurrent.futures


          def load_and_resize(image_filename):
           ### Read in the image data
           img = cv2.imread(image_filename)

           ### Resize the image
           img = cv2.resize(img, (600600)) 


          ### Create a pool of processes. By default, one is created for each CPU in your machine.
          with concurrent.futures.ProcessPoolExecutor() as executor:
           ### Get a list of files to process
           image_files = glob.glob("*.jpg")

           ### Process the list of files, but split the work across the process pool to use all CPUs
           ### Loop through all jpg files in the current folder 
           ### Resize each one to size 600x600
           executor.map(load_and_resize, image_files)


          從以上代碼中摘出一行:


          with concurrent.futures.ProcessPoolExecutor() as executor:


          你的 CPU 核越多,啟動(dòng)的 Python 進(jìn)程越多,我的 CPU 有 6 個(gè)核。實(shí)際處理代碼如下:


          executor.map(load_and_resize, image_files)


          「executor.map()」將你想要運(yùn)行的函數(shù)和列表作為輸入,列表中的每個(gè)元素都是我們函數(shù)的單個(gè)輸入。由于我們有 6 個(gè)核,我們將同時(shí)處理該列表中的 6 個(gè)項(xiàng)目!


          如果再次用以下代碼運(yùn)行我們的程序:


          time python fast_res_conversion.py


          我們可以將運(yùn)行時(shí)間降到 1.14265 秒,速度提升了近 6 倍!


          注意:在生成更多 Python 進(jìn)程及在它們之間整理數(shù)據(jù)時(shí)會(huì)有一些開銷,所以速度提升并不總是這么明顯。但是總的來說,速度提升還是非常可觀的。


          它總是那么快嗎? 


          如果你有一個(gè)數(shù)據(jù)列表要處理,而且在每個(gè)數(shù)據(jù)點(diǎn)上執(zhí)行相似的運(yùn)算,那么使用 Python 并行池是一個(gè)很好的選擇。但有時(shí)這不是最佳解決方案。并行池處理的數(shù)據(jù)不會(huì)在任何可預(yù)測的順序中進(jìn)行處理。如果你對(duì)處理后的結(jié)果有特殊順序要求,那么這個(gè)方法可能不適合你。


          你處理的數(shù)據(jù)也必須是 Python 可以「炮制」的類型。所幸這些指定類別都很常見。以下來自 Python 官方文件:


          • None, True, 及 False

          • 整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù)

          • 字符串、字節(jié)、字節(jié)數(shù)組

          • 只包含可挑選對(duì)象的元組、列表、集合和字典

          • 在模塊頂層定義的函數(shù)(使用 def ,而不是 lambda )

          • 在模塊頂層定義的內(nèi)置函數(shù)

          • 在模塊頂層定義的類

          • 這種類的實(shí)例,其 __dict__ 或調(diào)用__getstate__() 的結(jié)果是可選擇的(參見「Pickling Class Instances」一節(jié))。

          原文鏈接:https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5





             
          -----------------------
          公眾號(hào):Python知識(shí)圈
          博客:www.pyzhishiquan.com
          知乎Python知識(shí)圈
          微信視頻號(hào):菜鳥程序員 (分享有趣的編程技巧、Python技巧)
          bilibili:菜鳥程序員的日常(目前原創(chuàng)視頻:22,累計(jì)播放量:75萬)


          我的微信視頻號(hào)定時(shí)更新中,近期真人出鏡分析講解 Python 經(jīng)典習(xí)題,后續(xù)會(huì)分享更多的干貨,歡迎關(guān)注我的微信視頻號(hào)。

             


          Python知識(shí)圈公眾號(hào)的交流群已經(jīng)建立,群里可以領(lǐng)取 Python 和人工智能學(xué)習(xí)資料,大家可以一起學(xué)習(xí)交流,效率更高,如果是想發(fā)推文、廣告、砍價(jià)小程序的敬請(qǐng)繞道一定記得備注「交流學(xué)習(xí)」,我會(huì)盡快通過好友申請(qǐng)哦!通過好友后私聊我「學(xué)習(xí)資料」或者「進(jìn)群」都可以。

          掃碼添加,備注:交流學(xué)習(xí)




          往期推薦
          01

          公眾號(hào)所有文章匯總導(dǎo)航(2-10更新)

          02

          Github上有趣的100個(gè)Python項(xiàng)目

          03

          打基礎(chǔ)一定要吃透這12類 Python 內(nèi)置函數(shù)


          我就知道你“在看”

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区四区精品视频 | 在线视频二区 | 天天干BB | 曰韩-级视频 | 亚洲va欧美ⅴa在线 |