入門 | 三行Python代碼,讓數據預處理速度提高2到6倍

2021-02-19 機器之心

選自TowardsDataScience

者: George Seif

機器之心編譯

參與:張倩、李澤南

在 Python 中,我們可以找到原生的並行化運算指令。本文可以教你僅使用 3 行代碼,大大加快數據預處理的速度。

Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理數據。但當我們面臨大量數據時,一些問題就會顯現……

目前,大數據(Big Data)這個術語通常用於表示包含數十萬數據點的數據集。在這樣的尺度上,工作進程中加入任何額外的計算都需要時刻注意保持效率。在設計機器學習系統時,數據預處理非常重要——在這裡,我們必須對所有數據點使用某種操作。

在默認情況下,Python 程序是單個進程,使用單 CPU 核心執行。而大多數當代機器學習硬體都至少搭載了雙核處理器。這意味著如果沒有進行優化,在數據預處理的時候會出現「一核有難九核圍觀」的情況——超過 50% 的算力都會被浪費。在當前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時候,這種情況會變得更加明顯。

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

標準方法

讓我們舉一個簡單的例子,在單個文件夾中有一個圖片數據集,其中有數萬張圖片。在這裡,我們決定使用 1000 張。我們希望在所有圖片被傳遞到深度神經網絡之前將其調整為 600×600 像素解析度的形式。以下是你經常會在 GitHub 上看到的標準 Python 代碼:

import glob
import os
import cv2




for image_filename in glob.glob("*.jpg"):
 
 img = cv2.imread(image_filename)

 
 img = cv2.resize(img, (600, 600)) 

上面的程序遵循你在處理數據腳本時經常看到的簡單模式:

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

2. 使用 for 循環逐個處理每個數據,然後在每個循環迭代上運行預處理。

讓我們在一個包含 1000 個 jpeg 文件的文件夾上測試這個程序,看看運行它需要多久:

time python standard_res_conversion.py

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

更快的方法

為了便於理解並行化的提升,假設我們需要執行相同的任務,比如將 1000 個釘子釘入木頭,假如釘入一個需要一秒,一個人就需要 1000 秒來完成任務。四個人組隊就只需要 250 秒。

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

這一方法的重點在於,Python 幫我們處理了所有棘手的工作。我們只需告訴它我們想要運行哪個函數,要用多少 Python 實例,剩下的就交給它了!只需改變三行代碼。實例:

import glob
import os
import cv2
import concurrent.futures


def load_and_resize(image_filename):
 
 img = cv2.imread(image_filename)

 
 img = cv2.resize(img, (600, 600)) 



with concurrent.futures.ProcessPoolExecutor() as executor:
 
 image_files = glob.glob("*.jpg")

 
 
 
 executor.map(load_and_resize, image_files)

從以上代碼中摘出一行:

with concurrent.futures.ProcessPoolExecutor() as executor:

你的 CPU 核越多,啟動的 Python 進程越多,我的 CPU 有 6 個核。實際處理代碼如下:

executor.map(load_and_resize, image_files)

「executor.map()」將你想要運行的函數和列表作為輸入,列表中的每個元素都是我們函數的單個輸入。由於我們有 6 個核,我們將同時處理該列表中的 6 個項目!

如果再次用以下代碼運行我們的程序:

time python fast_res_conversion.py

我們可以將運行時間降到 1.14265 秒,速度提升了近 6 倍!

注意:在生成更多 Python 進程及在它們之間整理數據時會有一些開銷,所以速度提升並不總是這麼明顯。但是總的來說,速度提升還是非常可觀的。

它總是那麼快嗎? 

如果你有一個數據列表要處理,而且在每個數據點上執行相似的運算,那麼使用 Python 並行池是一個很好的選擇。但有時這不是最佳解決方案。並行池處理的數據不會在任何可預測的順序中進行處理。如果你對處理後的結果有特殊順序要求,那麼這個方法可能不適合你。

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

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

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com

投稿或尋求報導:content@jiqizhixin.com

廣告 & 商務合作:bd@jiqizhixin.com

相關焦點

  • 三行Python代碼,讓數據處理速度提高2到6倍
    ,大大加快數據預處理的速度。這意味著如果沒有進行優化,在數據預處理的時候會出現「一核有難九核圍觀」的情況——超過 50% 的算力都會被浪費。在當前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時候,這種情況會變得更加明顯。
  • 手把手 | 嫌Python太慢?並行運算Process Pools三行代碼給你4倍...
    多虧有Python的concurrent.futures模塊,僅需3行代碼就可以讓一個普通程序並行運行。2. 同時跑四個Python解釋器。3. 讓四個解釋器分別處理一部分圖片文件。4. 匯總四個解釋器的結果得到最終結果。四個Python程序分別在4個CPU上運行,跟之前在1個CPU運行相比大概可以達到4倍的速度,對不對?
  • 一個簡單的更改讓PyTorch讀取表格數據的速度提高20倍
    我將向您展示我在PyTorch中對表格的數據加載器進行的簡單更改如何將訓練速度提高了20倍以上,而循環沒有任何變化! 這只是PyTorch標準數據加載器的簡單替代品。 對於我正在訓練的模型,可以16分鐘的迭代時間,減少到40秒!所有這些都無需安裝任何新軟體包,不用進行任何底層代碼或任何超參數的更改。
  • Python數據預處理
    因為拿到的原始數據存在不完整、不一致、有異常的數據,而這些「錯誤」數據會嚴重影響到數據挖掘建模的執行效率甚至導致挖掘結果出現偏差,因此首先要數據清洗。數據清洗完成之後接著進行或者同時進行數據集成、轉換、歸一化等一系列處理,該過程就是數據預處理。一方面是提高數據的質量,另一方面可以讓數據更好的適應特定的挖掘模型,在實際工作中該部分的內容可能會佔整個工作的70%甚至更多。
  • 一行代碼讓你的Python運行速度提高100倍!Python真強!
    python一直被病垢運行速度太慢,但是實際上python的執行效率並不慢,慢的是python用的解釋器Cpython運行效率太差。「一行代碼讓python的運行速度提高100倍」這絕不是譁眾取寵的論調。我們來看一下這個最簡單的例子,從1一直累加到1億。
  • 嫌Python太慢?並行運算Process Pools三行代碼給你4倍提速!
    2. 同時跑四個Python解釋器。3. 讓四個解釋器分別處理一部分圖片文件。4. 匯總四個解釋器的結果得到最終結果。四個Python程序分別在4個CPU上運行,跟之前在1個CPU運行相比大概可以達到4倍的速度,對不對?好消息是Python可以幫我們解決並行運算麻煩的部分。
  • 提速30倍!這個加速包讓Python代碼飛起來
    其實有很多可以提高運行速度的辦法,比如: 利用多進程庫來使用所有的CPU內核; 如果你正在使用NumPy,Pandas,或是Scikit-Learn庫,那麼可以使用Rapids來提高GPU的處理速度。
  • 八行python代碼展現程式設計師從入門到大神的八種階段
    你敢想像你從入門python代碼、網絡達人、反重力怪才、愛情自由怪、資源盜獵者、頓悟入禪、無所不能或者卷鋪跑路8個狀態只用了簡簡單單的8行代碼嗎?這八種狀態也是一個程式設計師從入門到大神(跑路)的八個階段,每個階段對應一行代碼並且可以直接運行,看看你現在已經到了哪個階段1.初學pythonprint("Hello World!")
  • python性能提高10倍的通用方法
    首先創建一個含有10個元素的數組,然後對每個元素執行sin正弦函數計算,代碼如下:import  numpy  as  npx = np.arange(0,10)s = np.sin(x)print(x)print(s)結果:[0 1 2 3 4 5 6 7 8 9][ 0. 0.84147098 0.90929743
  • Python 從入門到進階經典書籍,你看過幾本?
    可以開始關注一些諸如編碼規範、pythonic、python並發、python解釋器這些了。2.1、 Effective Python:編寫高質量 Python 代碼的 59 個有效方法這本書每個章節相互獨立,每個章節對特定的話題進行深入的探討,其中就有介紹代碼風格的寫法習慣,高級的 Python 用法,高效的使用 Python 庫等。
  • Python推薦書籍從入門到進階(珍藏版)
    2.《Python編程:從入門到實踐》本書的講解很到位,不過就是在對一些簡單知識點的講解方面投入了過多的筆墨。5.9.《Python學習手冊(第3版》目標受眾為初學者,內容比較詳實,可以作為入門書《編寫高質量代碼 改善Python程序的91個建議》寫的很實用,有點意思,對於提高自己對python的認識很有幫助. 對於python的內部機制有簡明的介紹,對於一些容易搞混的概念也有很詳細的對比
  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序,看到在我的 openSUSE
  • Python簡化代碼機器學習庫PyCaret 2.0發布
    PyCaret是一個開源的,低代碼的Python機器學習庫,旨在自動化機器學習工作流。它是端到端的機器學習和模型管理工具。它可以加速機器學習的實驗周期,提高你的效率。和其他開源機器學習庫相比,PyCaret是低代碼的。它可以用幾個單詞取代上百行代碼。這大大提高了實驗的速度和效率。在版本說明 release notes  中查看PyCaret 2.0的更多細節。
  • Unladen Swallow項目計劃:提高Python速度5倍
    Google的Python工程師發布了一個新項目,目的是讓Python的速度提高至少5倍。新項目名叫Unladen Swallow,意圖尋找新的Python解釋程序虛擬機,新的JIT編譯引擎。第一季度的目標是實現25-35%的性能提升,目前已經完成,代碼發布在Google Code 網站上。
  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序,看到在我的 openSUSE
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    ,安裝完畢需要綁定Python開發環境,有多種土方法:1)增加環境變量,將opencv 的site-packages 添加到PYTHONPATH中2)使用ln 軟連接,將cv2.so 連結到python 環境的 site-packages中3)直接cp cv2.so 到 python 環境的 site-packages 目錄下更簡單地是執行如下命令
  • vscode寫Python數據處理分析代碼,由安裝配置到cell交互模式
    此系列文章可在以下公眾號目錄找到 : 數據大宇宙 > Python入門必備 > 必備知識最近有許多小夥伴問我要入門 Python 的資料,還有小夥伴完全沒有入門 Python 就直接購買了我的 pandas 專欄。因此我決定寫幾篇 Python 數據處理分析必備的入門知識系列文章,以幫助有需要的小夥伴們更好入門。
  • 為什麼入門大數據選擇Python而不是Java?
    畢竟出自wuli馬大大之口,今年二月份我開始了學習大數據的道路,直到現在對大數據的學習脈絡和方法也漸漸清晰。今天我們就來談談學習大數據入門語言的選擇。當然並不只是我個人之見,此外我搜集了各路大神的見解綜合起來跟大家做個討論。java和python的區別到底在哪裡?
  • 【下載】Scikit-learn作者新書《Python機器學習導論》, 教程+代碼手把手帶你實踐機器學習算法
    簡介2. 有監督學習3. 無監督學習和預處理4. 數據表示和特徵工程5. 模型評估與提高6. 算法實踐流程7. 有了這本書,你會學到:▌圖書配套Github代碼該代碼庫包含Andreas Mueller和Sarah Guido即將出版的書「Python機器學習導論」的代碼。
  • 如何用i5實現20倍的Python運行速度?
    這就是我怎麼做的:安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序