中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

三行Python代碼,讓數(shù)據(jù)預(yù)處理速度提高2到6倍

2018-10-08    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

 

 

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

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

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

 

 

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

標準方法

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

 

 

上面的程序遵循你在處理數(shù)據(jù)腳本時經(jīng)?吹降暮唵文J剑

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

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

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

 

 

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

更快的方法

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

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

♦ 將 jpeg 文件列表分成 4 個小組;

♦ 運行 Python 解釋器中的 4 個獨立實例;

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

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

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

 

 

從以上代碼中摘出一行:

 

 

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

 

 

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

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

 

 

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

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

它總是那么快嗎?

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

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

♦ None, True, 及 False

♦ 整數(shù)、浮點數(shù)、復(fù)數(shù)

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

♦ 只包含可挑選對象的元組、列表、集合和字典

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

♦ 在模塊頂層定義的內(nèi)置函數(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

標簽: 大數(shù)據(jù) 代碼 腳本 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:機器學(xué)習(xí)中的數(shù)學(xué),這是一份新鮮出爐的熱門草稿

下一篇:從蘋果店員到機器學(xué)習(xí)工程師:學(xué)習(xí)AI,我是這樣起步的