還在抱怨Pandas運行速度慢?這幾個方法會顛覆你的看法

2021-03-02 AI派

作者:xiaoyu

知乎:https://zhuanlan.zhihu.com/pypcfx

介紹:一個半路轉行的數據挖掘工程師

▍前言

最近很多朋友問我pandas提速的問題,我把之前發過的文章再分享一下。

當大家談到數據分析時,提及最多的語言就是Python和SQL。Python之所以適合數據分析,是因為它有很多第三方強大的庫來協助,pandas就是其中之一。pandas的文檔中是這樣描述的:

「快速,靈活,富有表現力的數據結構,旨在使」關係「或」標記「數據的使用既簡單又直觀。」

我們知道pandas的兩個主要數據結構:dataframeseries,我們對數據的一些操作都是基於這兩個數據結構的。但在實際的使用中,我們可能很多時候會感覺運行一些數據結構的操作會異常的慢。一個操作慢幾秒可能看不出來什麼,但是一整個項目中很多個操作加起來會讓整個開發工作效率變得很低。有的朋友抱怨pandas簡直太慢了,其實對於pandas的一些操作也是有一定技巧的。

pandas是基於numpy庫的數組結構上構建的,並且它的很多操作都是(通過numpy或者pandas自身由Cpython實現並編譯成C的擴展模塊)在C語言中實現的。因此,如果正確使用pandas的話,它的運行速度應該是非常快的。

本篇將要介紹幾種pandas中常用到的方法,對於這些方法使用存在哪些需要注意的問題,以及如何對它們進行速度提升。

將datetime數據與時間序列一起使用的優點

進行批量計算的最有效途徑

通過HDFStore存儲數據節省時間

▍使用Datetime數據節省時間

我們來看一個例子。

>>> import pandas as pd
>>> pd.__version__
'0.23.1'

# 導入數據集
>>> df = pd.read_csv('demand_profile.csv')
>>> df.head()
     date_time  energy_kwh
0  1/1/13 0:00       0.586
1  1/1/13 1:00       0.580
2  1/1/13 2:00       0.572
3  1/1/13 3:00       0.596
4  1/1/13 4:00       0.592

從運行上面代碼得到的結果來看,好像沒有什麼問題。但實際上pandas和numpy都有一個 dtypes 的概念。如果沒有特殊聲明,那麼date_time將會使用一個 object 的dtype類型,如下面代碼所示:

>>> df.dtypes
date_time      object
energy_kwh    float64
dtype: object

>>> type(df.iat[0, 0])
str

object 類型像一個大的容器,不僅僅可以承載 str,也可以包含那些不能很好地融進一個數據類型的任何特徵列。而如果我們將日期作為 str 類型就會極大的影響效率。

因此,對於時間序列的數據而言,我們需要讓上面的date_time列格式化為datetime對象數組(pandas稱之為時間戳)。pandas在這裡操作非常簡單,操作如下:

>>> df['date_time'] = pd.to_datetime(df['date_time'])
>>> df['date_time'].dtype
datetime64[ns]

我們來運行一下這個df看看轉化後的效果是什麼樣的。

>>> df.head()
               date_time    energy_kwh
0    2013-01-01 00:00:00         0.586
1    2013-01-01 01:00:00         0.580
2    2013-01-01 02:00:00         0.572
3    2013-01-01 03:00:00         0.596
4    2013-01-01 04:00:00         0.592

date_time的格式已經自動轉化了,但這還沒完,在這個基礎上,我們還是可以繼續提高運行速度的。如何提速呢?為了更好的對比,我們首先通過 timeit 裝飾器來測試一下上面代碼的轉化時間。

>>> @timeit(repeat=3, number=10)
... def convert(df, column_name):
...     return pd.to_datetime(df[column_name])

>>> df['date_time'] = convert(df, 'date_time')
Best of 3 trials with 10 function calls per trial:
Function `convert` ran in average of 1.610 seconds.

1.61s,看上去挺快,但其實可以更快,我們來看一下下面的方法。

>>> @timeit(repeat=3, number=100)
>>> def convert_with_format(df, column_name):
...     return pd.to_datetime(df[column_name],
...                           format='%d/%m/%y %H:%M')
Best of 3 trials with 100 function calls per trial:
Function `convert_with_format` ran in average of 0.032 seconds.

結果只有0.032s,快了將近50倍。原因是:我們設置了轉化的格式format。由於在CSV中的datetimes並不是 ISO 8601 格式的,如果不進行設置的話,那麼pandas將使用 dateutil 包把每個字符串str轉化成date日期。

相反,如果原始數據datetime已經是 ISO 8601 格式了,那麼pandas就可以立即使用最快速的方法來解析日期。這也就是為什麼提前設置好格式format可以提升這麼多。

▍pandas數據的循環操作

仍然基於上面的數據,我們想添加一個新的特徵,但這個新的特徵是基於一些時間條件的,根據時長(小時)而變化,如下:

因此,按照我們正常的做法就是使用apply方法寫一個函數,函數裡面寫好時間條件的邏輯代碼。

def apply_tariff(kwh, hour):
   
 """計算每個小時的電費"""    
    if 0 <= hour < 7:
        rate = 12
    elif 7 <= hour < 17:
        rate = 20
    elif 17 <= hour < 24:
        rate = 28
    else:
        raise ValueError(f'Invalid hour: {hour}')
    return rate * kwh

然後使用for循環來遍歷df,根據apply函數邏輯添加新的特徵,如下:

>>> 
>>> @timeit(repeat=3, number=100)
... def apply_tariff_loop(df):
...     """Calculate costs in loop.  Modifies `df` inplace."""
...     energy_cost_list = []
...     for i in range(len(df)):
...         

...         energy_used = df.iloc[i]['energy_kwh']
...         hour = df.iloc[i]['date_time'].hour
...         energy_cost = apply_tariff(energy_used, hour)
...         energy_cost_list.append(energy_cost)
...     df['cost_cents'] = energy_cost_list
... 
>>> apply_tariff_loop(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_loop` ran in average of 
3.152 seconds.

對於那些寫Pythonic風格的人來說,這個設計看起來很自然。然而,這個循環將會嚴重影響效率,也是不贊同這麼做。原因有幾個:

▍使用itertuples() 和iterrows() 循環

那麼推薦做法是什麼樣的呢?

實際上可以通過pandas引入itertuplesiterrows方法可以使效率更快。這些都是一次產生一行的生成器方法,類似scrapy中使用的yield用法。

.itertuples為每一行產生一個namedtuple,並且行的索引值作為元組的第一個元素。nametuple是Python的collections模塊中的一種數據結構,其行為類似於Python元組,但具有可通過屬性查找訪問的欄位。

.iterrows為DataFrame中的每一行產生(index,series)這樣的元組。

雖然.itertuples往往會更快一些,但是在這個例子中使用.iterrows,我們看看這使用iterrows後效果如何。

>>> @timeit(repeat=3, number=100)
... def apply_tariff_iterrows(df):
...     energy_cost_list = []
...     for index, row in df.iterrows():
...        
 
...         energy_used = row['energy_kwh']
...         hour = row['date_time'].hour
...         
...         energy_cost = apply_tariff(energy_used, hour)
...         energy_cost_list.append(energy_cost)
...     df['cost_cents'] = energy_cost_list
...
>>> apply_tariff_iterrows(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_iterrows` ran in average of 
0.713 seconds.

語法方面:這樣的語法更明確,並且行值引用中的混亂更少,因此它更具可讀性。

在時間收益方面:快了近5倍!但是,還有更多的改進空間。我們仍然在使用某種形式的Python for循環,這意味著每個函數調用都是在Python中完成的,理想情況是它可以用Pandas內部架構中內置的更快的語言完成。

▍Pandas的 .apply()方法

我們可以使用.apply方法而不是.iterrows進一步改進此操作。Pandas的.apply方法接受函數(callables)並沿DataFrame的軸(所有行或所有列)應用它們。在此示例中,lambda函數將幫助你將兩列數據傳遞給apply_tariff():

>>> @timeit(repeat=3, number=100)
... def apply_tariff_withapply(df):
...     df['cost_cents'] = df.apply(
...         lambda row: apply_tariff(
...             kwh=row['energy_kwh'],
...             hour=row['date_time'].hour),
...         axis=1)
...
>>> apply_tariff_withapply(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_withapply` ran in average of 0.272 seconds.

.apply的語法優點很明顯,行數少,代碼可讀性高。在這種情況下,所花費的時間大約是.iterrows方法的一半。

但是,這還不是「非常快」。一個原因是.apply()將在內部嘗試循環遍歷Cython迭代器。但是在這種情況下,傳遞的lambda不是可以在Cython中處理的東西,因此它在Python中調用,因此並不是那麼快。 

如果你使用.apply()獲取10年的小時數據,那麼你將需要大約15分鐘的處理時間。如果這個計算只是大型模型的一小部分,那麼你真的應該加快速度。這也就是矢量化操作派上用場的地方。

▍矢量化操作:使用.isin()選擇數據

什麼是矢量化操作?如果你不基於一些條件,而是可以在一行代碼中將所有電力消耗數據應用於該價格(df ['energy_kwh'] * 28),類似這種。這個特定的操作就是矢量化操作的一個例子,它是在Pandas中執行的最快方法。 

但是如何將條件計算應用為Pandas中的矢量化運算?一個技巧是根據你的條件選擇和分組DataFrame,然後對每個選定的組應用矢量化操作。 在下一個示例中,你將看到如何使用Pandas的.isin()方法選擇行,然後在向量化操作中實現上面新特徵的添加。在執行此操作之前,如果將date_time列設置為DataFrame的索引,則會使事情更方便:

df.set_index('date_time', inplace=True)

@timeit(repeat=3, number=100)
def apply_tariff_isin(df):
    

    peak_hours = df.index.hour.isin(range(17, 24))
    shoulder_hours = df.index.hour.isin(range(7, 17))
    off_peak_hours = df.index.hour.isin(range(0, 7))

    
    df.loc[peak_hours, 'cost_cents'] = df.loc[peak_hours, 'energy_kwh'] * 28
    df.loc[shoulder_hours,'cost_cents'] = df.loc[shoulder_hours, 'energy_kwh'] * 20
    df.loc[off_peak_hours,'cost_cents'] = df.loc[off_peak_hours, 'energy_kwh'] * 12

我們來看一下結果如何。

>>> apply_tariff_isin(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_isin` ran in average of 0.010 seconds.

為了了解剛才代碼中發生的情況,我們需要知道.isin()方法返回的是一個布爾值數組,如下所示:

[False, False, False, ..., True, True, True]

這些值標識哪些DataFrame索引(datetimes)落在指定的小時範圍內。然後,當你將這些布爾數組傳遞給DataFrame的.loc索引器時,你將獲得一個僅包含與這些小時匹配的行的DataFrame切片。在那之後,僅僅是將切片乘以適當的費率,這是一種快速的矢量化操作。 

這與我們上面的循環操作相比如何?首先,你可能會注意到不再需要apply_tariff(),因為所有條件邏輯都應用於行的選擇。因此,你必須編寫的代碼行和調用的Python代碼會大大減少。 

處理時間怎麼樣?比不是Pythonic的循環快315倍,比.iterrows快71倍,比.apply快27倍。

▍還可以做的更好嗎?

在apply_tariff_isin中,我們仍然可以通過調用df.loc和df.index.hour.isin三次來進行一些「手動工作」。如果我們有更精細的時隙範圍,你可能會爭辯說這個解決方案是不可擴展的。幸運的是,在這種情況下,你可以使用Pandas的pd.cut() 函數以編程方式執行更多操作:

@timeit(repeat=3, number=100)
def apply_tariff_cut(df):
    cents_per_kwh = pd.cut(x=df.index.hour,
                           bins=[0, 7, 17, 24],
                           include_lowest=True,
                           labels=[12, 20, 28]).astype(int)
    df['cost_cents'] = cents_per_kwh * df['energy_kwh']

讓我們看看這裡發生了什麼。pd.cut() 根據每小時所屬的bin應用一組標籤(costs)。

注意include_lowest參數表示第一個間隔是否應該是包含左邊的(您希望在組中包含時間= 0)。

這是一種完全矢量化的方式來獲得我們的預期結果,它在時間方面是最快的:

>>> apply_tariff_cut(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_cut` ran in average of 0.003 seconds.

到目前為止,時間上基本快達到極限了,只需要花費不到一秒的時間來處理完整的10年的小時數據集。但是,最後一個選項是使用 NumPy 函數來操作每個DataFrame的底層NumPy數組,然後將結果集成回Pandas數據結構中。

▍使用Numpy繼續加速

使用Pandas時不應忘記的一點是Pandas Series和DataFrames是在NumPy庫之上設計的。這為你提供了更多的計算靈活性,因為Pandas可以與NumPy陣列和操作無縫銜接。 

下面,我們將使用NumPy的 digitize() 函數。它類似於Pandas的cut(),因為數據將被分箱,但這次它將由一個索引數組表示,這些索引表示每小時所屬的bin。然後將這些索引應用於價格數組:

@timeit(repeat=3, number=100)
def apply_tariff_digitize(df):
    prices = np.array([12, 20, 28])
    bins = np.digitize(df.index.hour.values, bins=[7, 17, 24])
    df['cost_cents'] = prices[bins] * df['energy_kwh'].values

與cut函數一樣,這種語法非常簡潔易讀。但它在速度方面有何比較?讓我們來看看:

>>> apply_tariff_digitize(df)
Best of 3 trials with 100 function calls per trial:
Function `apply_tariff_digitize` ran in average of 0.002 seconds.

在這一點上,仍然有性能提升,但它本質上變得更加邊緣化。使用Pandas,它可以幫助維持「層次結構」,如果你願意,可以像在此處一樣進行批量計算,這些通常排名從最快到最慢(最靈活到最不靈活): 

1. 使用向量化操作:沒有for循環的Pandas方法和函數。

2. 將.apply方法:與可調用方法一起使用。

3. 使用.itertuples:從Python的集合模塊迭代DataFrame行作為namedTuples。

4. 使用.iterrows:迭代DataFrame行作為(index,Series)對。雖然Pandas系列是一種靈活的數據結構,但將每一行構建到一個系列中然後訪問它可能會很昂貴。

5. 使用「element-by-element」循環:使用df.loc或df.iloc一次更新一個單元格或行。

▍使用HDFStore防止重新處理

現在你已經了解了Pandas中的加速數據流程,接著讓我們探討如何避免與最近集成到Pandas中的HDFStore一起重新處理時間。

通常,在構建複雜數據模型時,可以方便地對數據進行一些預處理。例如,如果您有10年的分鐘頻率耗電量數據,即使你指定格式參數,只需將日期和時間轉換為日期時間可能需要20分鐘。你真的只想做一次,而不是每次運行你的模型,進行測試或分析。

你可以在此處執行的一項非常有用的操作是預處理,然後將數據存儲在已處理的表單中,以便在需要時使用。但是,如何以正確的格式存儲數據而無需再次重新處理?如果你要另存為CSV,則只會丟失datetimes對象,並且在再次訪問時必須重新處理它。

Pandas有一個內置的解決方案,它使用 HDF5,這是一種專門用於存儲表格數據陣列的高性能存儲格式。 Pandas的 HDFStore 類允許你將DataFrame存儲在HDF5文件中,以便可以有效地訪問它,同時仍保留列類型和其他元數據。它是一個類似字典的類,因此您可以像讀取Python dict對象一樣進行讀寫。

以下是將預處理電力消耗DataFrame df存儲在HDF5文件中的方法:


data_store = pd.HDFStore('processed_data.h5')


data_store['preprocessed_df'] = df
data_store.close()

現在,你可以關閉計算機並休息一下。等你回來的時候,你處理的數據將在你需要時為你所用,而無需再次加工。以下是如何從HDF5文件訪問數據,並保留數據類型:


data_store = pd.HDFStore('processed_data.h5')


preprocessed_df = data_store['preprocessed_df']
data_store.close()

數據存儲可以容納多個表,每個表的名稱作為鍵。 

關於在Pandas中使用HDFStore的注意事項:您需要安裝PyTables> = 3.0.0,因此在安裝Pandas之後,請確保更新PyTables,如下所示:

pip install 

▍結論

如果你覺得你的Pandas項目不夠快速,靈活,簡單和直觀,請考慮重新考慮你使用該庫的方式。 

這裡探討的示例相當簡單,但說明了Pandas功能的正確應用如何能夠大大改進運行時和速度的代碼可讀性。以下是一些經驗,可以在下次使用Pandas中的大型數據集時應用這些經驗法則: 

嘗試儘可能使用矢量化操作,而不是在df 中解決for x的問題。如果你的代碼是許多for循環,那麼它可能更適合使用本機Python數據結構,因為Pandas會帶來很多開銷。

如果你有更複雜的操作,其中矢量化根本不可能或太難以有效地解決,請使用.apply方法。

如果必須循環遍歷數組(確實發生了這種情況),請使用.iterrows()或.itertuples()來提高速度和語法。

Pandas有很多可選性,幾乎總有幾種方法可以從A到B。請注意這一點,比較不同方法的執行方式,並選擇在項目環境中效果最佳的路線。

一旦建立了數據清理腳本,就可以通過使用HDFStore存儲中間結果來避免重新處理。

將NumPy集成到Pandas操作中通常可以提高速度並簡化語法。

參考:https://realpython.com/fast-flexible-pandas/

為了回饋一直以來支持我們的讀者,「每日贈書專區」會每天從留言支持我們的讀者中選擇一名最臉熟的讀者來贈予實體書籍(包郵),當前通過這種方式我們已贈送出 20+ 本書籍。

臉熟的評判標準是根據通過留言的次數來決定的

留言時需要按照今日留言主題來用心留言,否則不計入總數

每日贈書專區會出現在AI派當天發布文章的頭條或次條的文章末尾

今天我們的每日贈書專區出現在「」的位置上,書籍為《利用Python進行數據分析》

本書簡介:

還在苦苦尋覓用Python控制、處理、整理、分析結構化數據的完整課程?本書含有大量的實踐案例,你將學會如何利用各種Python庫(包括NumPy、pandas、matplotlib以及IPython等)高效地解決各式各樣的數據分析問題。

由於作者Wes McKinney是pandas庫的主要作者,所以本書也可以作為利用Python實現數據密集型應用的科學計算實踐指南。本書適合剛剛接觸Python的分析人員以及剛剛接觸科學計算的Python程式設計師。

👆↑↑點擊上方可購買

恭喜上期通過留言成功混臉熟的讀者:於李笑納,贈送一本《利用Python進行數據分析》

請該同學聯繫小編:wanglaoshi201907

/ 今日留言主題 /

你覺得Pandas還有哪些需要改進的地方?


點下「在看」,給文章蓋個戳吧!👇

相關焦點

  • 還在抱怨pandas運行速度慢?這幾個方法會顛覆你的看法
    我們知道pandas的兩個主要數據結構:dataframe和series,我們對數據的一些操作都是基於這兩個數據結構的。但在實際的使用中,我們可能很多時候會感覺運行一些數據結構的操作會異常的慢。一個操作慢幾秒可能看不出來什麼,但是一整個項目中很多個操作加起來會讓整個開發工作效率變得很低。
  • 用這幾個方法提高pandas運行速度
    我們知道pandas的兩個主要數據結構:dataframe和series,我們對數據的一些操作都是基於這兩個數據結構的。但在實際的使用中,我們可能很多時候會感覺運行一些數據結構的操作會異常的慢。一個操作慢幾秒可能看不出來什麼,但是一整個項目中很多個操作加起來會讓整個開發工作效率變得很低。
  • 一行代碼讓 pandas 的 apply 速度飆到極致!
    pandas提速的方法回顧如果想要讓pandas提速,東哥總結有兩個方法:1. 向量化向量化是最優的方法,具體用法參考文章:還在抱怨pandas運行速度慢?這幾個方法會顛覆你的看法。舉個例子,我們將向量化定義為使用Numpy表示整個數組而不是元素的計算。
  • pandas100個騷操作:使用 Datetime 提速 50 倍運行速度!
    提速 50 倍運行速度!平時我們運行pandas少不了和時間打交道,而大多情況下許多朋友都是暴力解決問題,直接讓pandas自己轉換和處理。對於平時的學習和小測試是沒什麼問題的,但當跑一些大數據的時候往往會非常的慢,而這個時間性能其實是完全可以優化的。本次東哥介紹一個非常簡單的操作,使用Datetime變換時間類型,讓你的代碼運行速度飛速提升。
  • 還在抱怨命運不好嗎?讀完富蘭克林這段語錄,會顛覆你的認知!
    如果你還在抱怨命運不好嗎?我們不妨先讀一下富蘭克林這段語錄,會顛覆你的認知!文字如下:我未曾見過一個早起、勤奮、謹慎、誠實的人抱怨命運不好, 良好的品格,優良的習慣,堅強的意志,是不會被假設所謂的命運打敗的。
  • 一行代碼讓你的pandas運行得更快
    但是,當處理過於龐大的數據時,單個內核上運行的 Pandas 就會變得力不從心,人們不得不求助於不同的分布式系統來提高性能。然而,為了提高性能而做的這種權衡會帶來陡峭的學習曲線。本質上,用戶只是想讓 Pandas 運行得更快,而不是為了特定的硬體設置而優化其工作流。這意味著人們希望在處理 10KB 的數據集時,可以使用與處理 10TB 數據集時相同的 Pandas 腳本。
  • 你的iPhone運行變慢了嗎?6個提高蘋果手機運行速度的方法
    但是,隨著使用時間的延長和手機年齡的增長,我們的iPhone會減速,讓我們對性能不佳感到沮喪。你的手機運行速度不如以前快有很多原因。當處理器、數據機和存儲模塊在物理上老化並開始惡化時,就會發生衰減,這會降低它們的性能。然而,如果你在過去幾年內購買了你的蘋果設備,那麼比特率下降的可能性是微乎其微的,因為這個設備還是相對較新的。
  • Pandas常見的性能優化方法
    但Pandas在使用上有一些技巧和需要注意的地方,如果你沒有合適的使用,那麼Pandas可能運行速度非常慢。本文將整理一些Pandas使用技巧,主要是用來節約內存和提高代碼速度。1 數據讀取與存取在Pandas中內置了眾多的數據讀取函數,可以讀取眾多的數據格式,最常見的就是read_csv函數從csv文件讀取數據了。
  • 想讓pandas運行更快嗎?那就用Modin吧
    而 Modin 能夠將 pandas 的運行速度提高好幾倍,而無需切換 API 來適應不同的數據規模。「通過更改一行代碼擴展你的 pandas 工作流。」Pandas 是數據科學領域的工作者都熟知的程序庫。它提供高性能、易於使用的數據結構和數據分析工具。
  • iPhone手機運行太卡?教你使用這幾個功能,運行速度瞬間翻倍!
    雖然2017年蘋果發布了iPhone 8/8Plus/X,但目前用戶使用最多的仍然是iPhone 6與iPhone 7系列,運行變慢、卡頓的現象時有發生,這除了蘋果刻意降頻之外,和iPhone用戶本身的使用習慣也有著一定的關係,今天我們就教給大家一些好方法,讓你的iPhone運行速度快速提升
  • 科技:你的iPhone運行速度開始變慢了?教你如何加快手機速度
    導語:蘋果生產世界上最快的智慧型手機,但這並不意味著iphone就不會出現性能問題或表現遲緩。幸運的是,如果你的iPhone似乎比它應該的要慢,你可以做很多事情來測試它的性能,如果你注意到一個問題,提高你的iPhone的速度。
  • 拳皇13動作慢怎麼辦 運行速度慢如何解決
    不少玩家在玩拳皇13的時候,發現人物動作慢、遊戲運行速度慢,這是什麼原因呢?  拳皇13動作慢的原因如下:  1、電腦配置不夠  2、畫質沒設置好  解決方法:  電腦配置問題,需要更換更好的配置。如果電腦配置沒問題,可以嘗試設置畫質。
  • pandas100個騷操作:再見 for 循環!速度提升315倍!
    本次東哥介紹幾個常見的提速方法,一個比一個快,了解pandas本質,才能知道如何提速。另外,還使用df.iloc [i]['date_time']執行所謂的鏈式索引,這通常會導致意外的結果。這種方法的最大問題是計算的時間成本。對於8760行數據,此循環花費了3秒鐘。一、使用 iterrows循環第一種可以通過pandas引入iterrows方法讓效率更高。這些都是一次產生一行的生成器方法,類似scrapy中使用的yield用法。.
  • 看書慢?幾個方法助你提高閱讀速度
    01.寫在方法使用之前的話這不是一篇速讀教程,而是一篇讓人把閱讀速度從慢速提高到常速的方法說明。在說方法之前,我先來說一說什麼是常速,什麼是慢速。如果你在網上搜索關於閱讀速度的相關數據,會發現人們對於常速的定義是不同的,有的數據裡是200-500字/分鐘,有的是300-500字/每分鐘,有的是200-600字/每分鐘,在這些數據裡唯一能找到的共同點大概是百字以上,千字以下。
  • 僅需添加一行代碼,即可讓Pandas加速四倍 | Pandas on Ray
    快來了解新庫Modin,可以分割pandas的計算量,提高數據處理效率,一行代碼即刻開啟Pandas四倍速。Pandas作為Python中用於處理數據的庫,能簡單且靈活地處理不同種類、大小的數據。除此之外,Pandas還有許多函數有助於輕鬆處理不同數據。但Pandas也有缺點:處理大數據集的速度非常慢。在默認設置下,Pandas只使用單個CPU內核,在單進程模式下運行函數。
  • 提高數據處理效率,一行代碼開啟Pandas四倍速!
    但Pandas也有缺點:處理大數據集的速度非常慢。在默認設置下,Pandas只使用單個CPU內核,在單進程模式下運行函數。這不會影響小型數據,因為程式設計師可能都不會注意到速度的變化。但對於計算量繁雜的大數據集來說,僅使用單內核會導致運行速度非常緩慢。
  • Pandas性能優化:進階篇
    在這裡介紹一些更高級的pandas優化方法。方法3,使用numpy函數%timeit np.multiply(df['a'].values,df['b'].values)方法運行時間運行速度方法11.45s1方法2254µs5708方法341.2 µs3536
  • 思考python數據分析工具pandas-1簡介
    然而,當對數千行的龐大數據集進行操作時,這些微妙的性能差異會複合成更顯著的差異。對於普通的開發者來說,這可能看起來絕對離譜,但對於科研界來說,花幾天時間等待大數據計算運行並不稀奇。有時,計算確實需要這麼長的時間;然而,其他時候,程序只是以一種低效的方式編寫。
  • 問答:電腦運行速度變慢怎麼解決?
    問答:電腦運行速度變慢怎麼解決?老舊電腦的速度在使用中會變得越來越慢,相信幾乎所有人都會遇到這個問題,使電腦運行速度變慢的原因有很多,下面就為大家總結出原因和解決方案。解決電腦變慢的問題,首先可以清理電腦中長久不用的軟體(見上一條),然後進行磁碟的清理和碎片整理。當電腦處於節能模式時,運行多任務會出現卡頓的情況,可以在電源選項中開啟高性能模式。傳統的機械硬碟的讀寫速度較慢,可更換速度更快的固態硬碟,對於電腦響應速度的提升很大。
  • 你還在擔憂閱讀速度慢?!趕快進來看看!
    這是閱讀課上很常見的問題甚至學生已經熟悉掌握所有題型後仍然存在的問題在提出解決方法之前我們先搞明白閱讀速度和什麼有關係為什麼會慢?1) I have just received a letter from my brother, Tim. He is in Australia.