Hello!我是簡訊。后端編程業(yè)余選手。 曾就職于北京某智能旅行規(guī)劃公司,做 Python 后端開發(fā),現(xiàn)就職于某國企。公眾號主要分享編程相關技巧,同時插播可實際上手的副業(yè)項目。編輯器酷愛 Neovim,如果你也喜歡使用 Nvim,歡迎交流。 想在第一時間收到文章推送,請關注、星標和置頂「愛生活愛扣釘」 ★ 歡迎關注 愛生活愛扣釘 ★ 作為一名 Python 用戶,我經(jīng)常與 Excel 文件交互來管理數(shù)據(jù),因為數(shù)據(jù)分析通常涉及 Excel 或 CSV 格式共享信息。然而,Python 在處理 Excel 文件時速度明顯較慢。 在本文中,我將介紹在 Python 中加載數(shù)據(jù)的五種方法。在討論結束時,我們將實現(xiàn)三個數(shù)量級的速度提升,使處理速度快得令人難以置信。 實驗設置假設我們需要加載 10 個 Excel 文件,每個文件包含 20,000 行和 25 列,總計約 70MB。當您將事務數(shù)據(jù)從 SAP 等 ERP 系統(tǒng)傳輸?shù)?Python 中進行分析時,這種情況非常典型。 首先,我們將生成這些虛擬數(shù)據(jù),并通過導入必要的庫來設置我們的環(huán)境(稍后我們將深入探討使用 pickle 和 joblib 等庫的具體細節(jié))。 import pandas as pd 用 Python 加載數(shù)據(jù)的 5 種方法1:使用 Pandas 加載 Excel 文件我們將從加載 Excel 文件的最簡單方法開始。我們將初始化一個 Pandas DataFrame,然后按順序將每個 Excel 文件附加到其中。這種方法提供了一種清晰而直接的方式,可將多個來源的數(shù)據(jù)編譯到一個結構中進行分析。
運行大約需要 50 秒。相當慢。 將 Excel 文件轉換為 CSV 格式后,加載時間大幅縮短至 0.63 秒,比之前快了近 10 倍。Python 處理 CSV 文件的速度通常比 Excel 文件快得多,通??爝_ 100 倍。因此,使用 CSV 是處理大型數(shù)據(jù)集的高效策略。 不過,一個明顯的缺點是,與 .xlsx 文件相比,CSV 文件的大小通常較大。例如,在我們的示例中,CSV 文件每個 9.5MB,而 .xlsx 文件只有 6.4MB。 2:更智能地創(chuàng)建 Pandas 數(shù)據(jù)框為了進一步改進數(shù)據(jù)加載過程,我們可以優(yōu)化創(chuàng)建 Pandas DataFrames 的方式。我們不必將每個文件直接附加到現(xiàn)有的 DataFrame 中,因為這樣會很耗時: 1.我們將每個 Excel 或 CSV 文件加載到一個單獨的 DataFrame 中。2.2. 將這些 DataFrame 保存在一個列表中。3.最后,我們將列表中的所有 DataFrame 連接成一個 DataFrame。 這種方法通常比增量追加每個文件更快,因為它減少了重復擴展 DataFrame 所帶來的開銷。 start = time.time() 我們的加載時間略有縮短。根據(jù)我的經(jīng)驗,這種技術在處理較大的 DataFrames(通常超過 100MB 大?。r尤其有效。 3:使用 Joblib 并行 CSV 導入為了進一步加快加載過程,可以考慮并行導入多個文件。我們可以同時并行加載 10 個文件,而不是按順序加載每個文件。 這種方法利用了
與單核版本相比,我們成功地將速度提高了一倍。不過,需要注意的是,增加內核數(shù)量并不能線性提升性能。例如,在配備 M1 芯片的 Mac Air 上使用 8 個內核,我觀察到的速度提升是 2 倍,而不是 8 倍。 使用 Joblib 在 Python 中實現(xiàn)簡單并行化Joblib 是一個簡單的 Python 庫,專為并行處理而設計。它的操作類似于列表理解,但有一個關鍵區(qū)別:每次迭代都在單獨的線程上執(zhí)行。這種方法允許同時處理任務。下面是實現(xiàn)方法: def loop(file_number): 4:利用 Pickle 文件要想更快地存儲和檢索數(shù)據(jù),可以考慮使用 Pickle 文件。Pickle 是一種 Python 專用格式,設計用于序列化和反序列化對象,與 .csv 文件相比,可以更快地加載數(shù)據(jù)。 不過,一個明顯的缺點是,pickle 文件不是人類可讀的。與 .csv 文件不同,您不能在文本編輯器或電子表格程序中打開 pickle 文件,直接查看或編輯其內容。
我們成功地將處理時間縮短了 80%! 總的來說,使用 pickle 文件比使用 .csv 文件要快得多。不過,pickle 文件通常會占用更多的硬盤存儲空間(但在本例中不會)。 實際上,系統(tǒng)通常不會直接以 pickle 格式導出數(shù)據(jù)。我建議在以下情況下使用 pickle 文件: 1.供 Python 內部使用:如果您要保存 Python 進程中的數(shù)據(jù),并且不需要在 Excel 或其他非 Python 環(huán)境中打開這些數(shù)據(jù),那么可以將 DataFrames 存儲為 pickle 文件。這非常適合您打算在 Python 腳本或應用程序中重復使用的數(shù)據(jù)。 2.用于頻繁訪問文件:如果您重復加載相同的文件,那么在首次加載后將其保存為 pickle 文件會很有效。未來的進程可以直接從 pickle 文件加載,繞過較慢的 .csv 加載過程。 舉例說明要管理每月更新的事務數(shù)據(jù),可以在首次加載后將每個月的數(shù)據(jù)從 .csv 文件轉換為 .pickle 文件。這樣,您就可以快速訪問 pickle 格式的歷史數(shù)據(jù),從而在每月新數(shù)據(jù)到來時簡化工作流程。 5: 并行加載 Excel 文件如果您發(fā)現(xiàn)自己收到 Excel 文件,并且必須直接處理這些文件,那么仍然可以使用并行處理來提高效率。您可以使用 要實現(xiàn)這一點,需要調整循環(huán)中的函數(shù),以便專門處理 Excel 文件。這種修改包括使用專門用于加載 Excel 文件的函數(shù),然后使用 start = time.time() 我們成功地將加載時間縮短了 70%,從 50 秒減至 13 秒。 此外,你還可以利用這個并行加載過程來即時創(chuàng)建 pickle 文件。這樣,下次需要加載這些文件時,就可以利用腌制文件所提供的明顯更快的加載時間,確保近乎瞬時地訪問數(shù)據(jù)。這種方法不僅能優(yōu)化初始加載過程,還能簡化未來與相同數(shù)據(jù)集的交互。 通過各種數(shù)據(jù)加載方法,我們大大提高了效率,減少了處理大型數(shù)據(jù)集所需的時間:
這些結果凸顯了優(yōu)化文件格式和利用并行處理提高 Python 中數(shù)據(jù)加載操作性能的優(yōu)勢。 # 每天更新一下自己 # # 感謝你的閱讀 # |
|
來自: 西北望msm66g9f > 《培訓》