讓CPU核心物盡其用!本文介紹了僅需3行代碼,將Python數(shù)據(jù)處理速度提升2~6倍的簡單方法。這對大規(guī)模數(shù)據(jù)處理非常有用,一起來看。
Python是所有機器學習的首選編程語言。它易于使用,并擁有許多很棒的庫,可以輕松地處理數(shù)據(jù)。但是當我們需要處理大量數(shù)據(jù)時,事情就變得棘手了......
“大數(shù)據(jù)”這個詞通常指的是數(shù)據(jù)集,一個數(shù)據(jù)集里的數(shù)據(jù)點如果沒有數(shù)百萬個,也有數(shù)十萬。在這樣的規(guī)模上,每個小的計算加起來,而且我們需要在編碼過程的每個步驟保持效率。在考慮機器學習系統(tǒng)的效率時,經(jīng)常被忽視的一個關(guān)鍵步驟就是預處理階段,我們必須對所有數(shù)據(jù)點進行某種預處理操作。
默認情況下,Python程序使用單個CPU作為單個進程執(zhí)行。大多數(shù)用于機器學習的計算機至少有2個CPU核心。這意味著,對于2個CPU內(nèi)核的示例,在運行預處理時,50%或更多的計算機處理能力在默認情況下不會做任何事情!當你使用4核( Intel i5)或6核( Intel i7)時,就更浪費了。
但幸運的是,內(nèi)置的Python庫中有一些隱藏的功能,可以讓我們充分利用所有CPU內(nèi)核!感謝Python的concurrent.futures模塊,只需3行代碼就可以將一個普通程序轉(zhuǎn)換為一個可以跨CPU核心并行處理數(shù)據(jù)的程序。
標準方法
讓我們舉一個簡單的例子,我們在一個文件夾中有一個圖像數(shù)據(jù)集; 或者我們甚至有成千上萬的圖像!為了節(jié)省處理時間,我們在這里使用1000張圖像。我們希望在將所有圖像在傳輸?shù)缴疃?a href="http://wenjunhu.com/tags/神經(jīng)網(wǎng)絡(luò)/" target="_blank">神經(jīng)網(wǎng)絡(luò)之前將其大小調(diào)整為600x600。下面就是你經(jīng)常在GitHub上看到的一些非常標準的Python代碼。
這個程序遵循在數(shù)據(jù)處理腳本中經(jīng)??吹降暮唵文J剑?/p>
首先是要處理的文件(或其他數(shù)據(jù))列表;
你可以使用for循環(huán)逐個處理每個數(shù)據(jù)片段,然后在每個循環(huán)迭代上運行預處理
讓我們在一個包含1000個jpeg文件的文件夾上測試這個程序,看看運行需要多長時間:
在我的具有6個CPU核心的i7-8700k上,這個程序的運行時間是7.9864秒!對于這樣的高端CPU來說,似乎有點慢。讓我們看看我們可以做些什么來加快速度。
快速方式
為了理解我們希望Python如何并行處理事物,直觀地思考并行處理本身是有幫助的。假設(shè)我們必須執(zhí)行相同的任務(wù),例如將釘子釘入一塊木頭,我們的桶中有1000個釘子。如果釘每個釘子需要1秒鐘,那么1個人的話需要花1000秒完成工作。但是如果有4個人,我們會將整桶釘子平均分成4堆,然后每個人處理自己的一堆釘子。這樣,只需250秒即可完成任務(wù)!
在這個包含1000張圖像的任務(wù)中,也可以這樣處理:
將jpg文件列表分為4個較小的組。
運行Python解釋器的4個獨立實例。
讓每個Python實例處理4個較小數(shù)據(jù)組中的一個。
結(jié)合4個過程的結(jié)果,得到最終的結(jié)果列表。
這里最重要的部分是Python為我們處理了所有艱苦的工作。我們只是告訴它我們想要運行哪個函數(shù),以及使用多少Python實例,然后它完成了所有其他操作!我們只需修改3行代碼。
上面的代碼中的:
你有多少CPU核心就啟動多少Python進程,在我的例子中是6個。實際的處理代碼是這樣的:
executor.map()將你想要運行的函數(shù)和一個列表作為輸入,列表中的每個元素都是函數(shù)的單個輸入。由于我們有6個核心,我們將同時處理列表中的6個項!
再次運行程序看看:
運行時間是1.14265秒,幾乎加速了6倍!
注意:產(chǎn)生更多Python進程并在它們之間移動數(shù)據(jù)時,會產(chǎn)生一些開銷,因此不會總是得到這么大的速度提升。 但總的來說,加速相當顯著。
是否總能大幅加速?
當你有要處理的數(shù)據(jù)列表并且要對每個數(shù)據(jù)點執(zhí)行類似的計算時,使用Python并行池是一個很好的解決方案。但是,它并不總是完美的。并行池處理的數(shù)據(jù)不會以任何可預測的順序處理。如果你需要處理的結(jié)果按特定順序排列,那么這種方法可能不適合。
你處理的數(shù)據(jù)還必須是Python知道如何“pickle”的類型。幸運的是,這些類型很常見。以下來自Python官方文檔:
None, True, 及 False
整數(shù),浮點數(shù),復數(shù)
字符串,字節(jié),字節(jié)數(shù)組
僅包含可選對象的元組,列表,集合和詞典
在模塊的頂層定義的函數(shù)(使用def,而不是lambda)
在模塊頂層定義的內(nèi)置函數(shù)
在模塊頂層定義的類
這些類的實例,__dict__或調(diào)用__getstate __()的結(jié)果是可選擇的
-
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
600瀏覽量
28573 -
機器學習
+關(guān)注
關(guān)注
66文章
8420瀏覽量
132687 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84729
原文標題:3行代碼,Python數(shù)據(jù)預處理提速6倍!
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論