時間不夠用用什麼成語(時間不夠添加這個詞)
2023-05-09 06:10:38 3
全文共1860字,預計學習時長6分鐘
來源:Pexels
數據科學家一般需要具有更多核心和強大計算能力的伺服器來支持他們的工作。所以,在設備選擇上,他們往往更加青睞於四核、八核、渦輪增壓的筆記本電腦。
但是他們真的能百分百利用並發揮出手中這些東西的原始力量嗎?
有時他們在處理數據時會受到工具的限制;有時為了節省幾分鐘的時間,他們不會編寫一些無關緊要的代碼。最後,或許才意識到從長遠來看,時間優化才是真正一定幫助的。
那麼,科學家們能夠對此進行優化嗎?
當然,結果顯而易見。
這篇文章是關於科學家們運用手頭的計算能力,並使用Swifter軟體將其應用到panda數據幀中。
問題陳述
科學家們已經擁有一個巨大的panda數據幀,要對它應用一個複雜的函數,需要很多時間。
針對這篇文章,筆者將生成25萬行和4列的相關數據。
使用並行化可以很容易地獲得代碼的額外性能嗎?
import pandas as pdimport numpy as nppdf = pd.DataFrame(np.random.randint(0,100,size=(25000000,4)),columns=list('abcd'))
數據如下:
數據樣本
僅使用單個更改的並行化
來源:Pexels 放鬆並並行化!!
接下來進行一個簡單的實驗。
嘗試在數據幀(dataframe)中創建一個新列。這一步驟可以簡單地通過在panda中使用 apply-lambda 來實現。
def func(a,b): if a>50: return True elif b>75: return True else: return Falsepdf['e'] =pdf.apply(lambda x : func(x['a'],x['b']),axis=1)
以上的代碼大約需要10分鐘才能運行。筆者只是對以上這兩列做一個簡單的計算。
那能夠優化嗎?需要做些什麼呢?
當然,回答是肯定的,只要加上一個「神奇的詞」—— Swifter就能夠進行優化。
但是首先,需要安裝swifter軟體,這十分容易:
conda install -c conda-forgeswifter
然後只需在 apply 使用它之前導入並附加swifter關鍵字來進行操作。
import swifterpdf['e'] = pdf.swifter.apply(lambda x : func(x['a'],x['b']),axis=1)
這有效果嗎?
當然。與只使用函數本身相比,這一操作可以將運行時間縮短一倍。
這其中到底蘊藏著什麼奧秘呢?
來源:增加數據的大小如何影響Dask, Pan
Swifter通過向量化函數或在後端使用Dask並行化函數,再或者在數據集較小的情況下使用簡單的panda apply函數,來選擇實現函數 apply的最佳方式。
在本例中,Swifter使用Dask將apply函數與默認值並行化npartitions = cpu_count*2.
對於筆者正在處理的MacBook, 其CPU計數是6,而超線程是2。因此,CPU計數是12,這使得npartitions的值為24。
讀者也可以選擇自己設置n_partitions的值。筆者注意到默認值在大多數情況下都能正常運作,但讀者也可以通過調優它來獲得額外的加速。
例如:如果設置n_partitions=12,然後又得到了2x的加速。在這裡,減少分區數量會減少運行時間,因為分區之間的數據遷移成本很高。
結論
並行不是什麼靈丹妙藥,它是一劑炸彈。
並行化並不能解決所有的問題,仍然需要優化函數,但是它是一個很好的工具。
時間一去不復返,時間總是不夠用的。在這種情況下,需要在數據處理中用一個詞來進行並行處理。
這個詞是swifter。
來源:Pexels
工作固然重要,但人生在世,最重要的還是生活。
希望大家閱讀完這篇文章後,都能靈活運用它,提高效率,為自己省下「好好生活」的時間。
留言點讚關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範
,