日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

有一種快 1000 倍的方法讀取 Excel 文件

 西北望msm66g9f 2024-05-24 發(fā)布于山東

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
import numpy as np
from joblib import Parallel, delayed
import time

for file_number in range(10):
    values = np.random.uniform(size=(20000,25))
    pd.DataFrame(values).to_csv(f'Dummy {file_number}.csv')
    pd.DataFrame(values).to_excel(f'Dummy {file_number}.xlsx')
    pd.DataFrame(values).to_pickle(f'Dummy {file_number}.pickle')

用 Python 加載數(shù)據(jù)的 5 種方法

1:使用 Pandas 加載 Excel 文件

我們將從加載 Excel 文件的最簡單方法開始。我們將初始化一個 Pandas DataFrame,然后按順序將每個 Excel 文件附加到其中。這種方法提供了一種清晰而直接的方式,可將多個來源的數(shù)據(jù)編譯到一個結構中進行分析。

start = time.time()
df = pd.read_excel('Dummy 0.xlsx')
for file_number in range(1,10):
    df.append(pd.read_excel(f'Dummy {file_number}.xlsx'))
end = time.time()
print('Excel:', end - start)

運行大約需要 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()
df = []
for file_number in range(10):
    temp = pd.read_csv(f'Dummy {file_number}.csv')
    df.append(temp)
df = pd.concat(df, ignore_index=True)
end = time.time()
print('CSV2:', end - start)

我們的加載時間略有縮短。根據(jù)我的經(jīng)驗,這種技術在處理較大的 DataFrames(通常超過 100MB 大?。r尤其有效。

3:使用 Joblib 并行 CSV 導入

為了進一步加快加載過程,可以考慮并行導入多個文件。我們可以同時并行加載 10 個文件,而不是按順序加載每個文件。

這種方法利用了 joblib 庫的功能,它簡化了 Python 中的并行處理。通過使用 joblib 庫,我們可以將文件加載任務分配給多個內核或線程,從而大幅縮短整體加載時間。

start = time.time()
def loop(file_number):
    return pd.read_csv(f'Dummy {file_number}.csv')
df = Parallel(n_jobs=-1, verbose=10)(delayed(loop)(file_number) for file_number in range(10))
df = pd.concat(df, ignore_index=True)
end = time.time()
print('CSV//:', end - start)

與單核版本相比,我們成功地將速度提高了一倍。不過,需要注意的是,增加內核數(shù)量并不能線性提升性能。例如,在配備 M1 芯片的 Mac Air 上使用 8 個內核,我觀察到的速度提升是 2 倍,而不是 8 倍。

使用 Joblib 在 Python 中實現(xiàn)簡單并行化

Joblib 是一個簡單的 Python 庫,專為并行處理而設計。它的操作類似于列表理解,但有一個關鍵區(qū)別:每次迭代都在單獨的線程上執(zhí)行。這種方法允許同時處理任務。下面是實現(xiàn)方法:

def loop(file_number):
    return pd.read_csv(f'Dummy {file_number}.csv')
df = Parallel(n_jobs=-1, verbose=10)(delayed(loop)(file_number) for file_number in range(10))

#equivalent to
df = [loop(file_number) for file_number in range(10)]

4:利用 Pickle 文件

要想更快地存儲和檢索數(shù)據(jù),可以考慮使用 Pickle 文件。Pickle 是一種 Python 專用格式,設計用于序列化和反序列化對象,與 .csv 文件相比,可以更快地加載數(shù)據(jù)。

不過,一個明顯的缺點是,pickle 文件不是人類可讀的。與 .csv 文件不同,您不能在文本編輯器或電子表格程序中打開 pickle 文件,直接查看或編輯其內容。

start = time.time()
def loop(file_number):
    return pd.read_pickle(f'Dummy {file_number}.pickle')
df = Parallel(n_jobs=-1, verbose=10)(delayed(loop)(file_number) for file_number in range(10))
df = pd.concat(df, ignore_index=True)
end = time.time()
print('Pickle//:', end - start)

我們成功地將處理時間縮短了 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 文件,并且必須直接處理這些文件,那么仍然可以使用并行處理來提高效率。您可以使用 joblib 庫并行加載這些文件,就像處理其他格式文件一樣。

要實現(xiàn)這一點,需要調整循環(huán)中的函數(shù),以便專門處理 Excel 文件。這種修改包括使用專門用于加載 Excel 文件的函數(shù),然后使用 joblib 將這些任務分配給多個處理器。這種方法可以大大減少同時加載多個 Excel 文件所需的時間。

start = time.time()
def loop(file_number):
    return pd.read_excel(f'Dummy {file_number}.xlsx')
df = Parallel(n_jobs=-1, verbose=10)(delayed(loop)(file_number) for file_number in range(10))
df = pd.concat(df, ignore_index=True)
end = time.time()
print('Excel//:', end - start)

我們成功地將加載時間縮短了 70%,從 50 秒減至 13 秒。

此外,你還可以利用這個并行加載過程來即時創(chuàng)建 pickle 文件。這樣,下次需要加載這些文件時,就可以利用腌制文件所提供的明顯更快的加載時間,確保近乎瞬時地訪問數(shù)據(jù)。這種方法不僅能優(yōu)化初始加載過程,還能簡化未來與相同數(shù)據(jù)集的交互。

通過各種數(shù)據(jù)加載方法,我們大大提高了效率,減少了處理大型數(shù)據(jù)集所需的時間:

  • Excel 文件:最初需要 50 秒才能加載。
  • CSV 文件:縮短至 0.63 秒。
  • 更智能的 CSV 加載:進一步改進為 0.62 秒。
  • 并行 CSV 加載:縮短至 0.34 秒。
  • 并行拾取加載:大幅縮短至 0.07 秒,不到十分之一秒。
  • 并行 Excel 加載:縮短至 13.5 秒。

這些結果凸顯了優(yōu)化文件格式和利用并行處理提高 Python 中數(shù)據(jù)加載操作性能的優(yōu)勢。

# 每天更新一下自己 #

# 感謝你的閱讀 #

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多