亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

熊貓迭代有性能問題嗎?

熊貓迭代有性能問題嗎?

守候你守候我 2019-06-09 15:22:50
熊貓迭代有性能問題嗎?我注意到在使用熊貓的迭代時表現很差。這是別人經歷過的嗎?它是否特定于迭代,對于一定大小的數據(我正在處理的是2300萬行),是否應該避免這個函數?這次討論在GitHub上,我相信這是在將dtype混合到dataframe中時引起的,但是下面的簡單示例顯示,即使使用一個dtype(Float 64),它也存在。這在我的機器上需要36秒:import pandas as pdimport numpy as npimport time s1 = np.random.randn(2000000)s2 = np.random.randn(2000000)dfa = pd.DataFrame({'s1': s1, 's2': s2})start = time.time()i=0for rowindex,  row in dfa.iterrows():     i+=1end = time.time()print end - start為什么像應用這樣的向量化操作要快得多?我想一定有一些逐行迭代在那里進行。在我的情況下,我不知道如何不使用迭代(這將為將來的問題保留下來)。因此,如果您一直能夠避免此迭代,我將非常感謝您的收聽。我是根據不同數據中的數據進行計算。謝謝!-編輯:我想運行的代碼的簡化版本添加在下面-import pandas as pdimport numpy as np#%% Create the original tablest1 = {'letter':['a','b'],       'number1':[50,-10]}t2 = {'letter':['a','a','b','b'],       'number2':[0.2,0.5,0.1,0.4]}table1 = pd.DataFrame(t1)table2 = pd.DataFrame(t2)       #%% Create the body of the new tabletable3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0])       #%% Iterate through filtering relevant data, optimizing, returning infofor row_index, row in table1.iterrows():        t2info = table2[table2.letter == row['letter']].reset_index()     table3.ix[row_index,] = optimize(t2info,row['number1'])#%% Define optimizationdef optimize(t2info, t1info):     calculation = []     for index, r in t2info.iterrows():         calculation.append(r['number2']*t1info)     maxrow = calculation.index(max(calculation))     return t2info.ix[maxrow]
查看完整描述

3 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

一般來說,iterrows應該只在非常具體的情況下使用。這是執行各種操作的一般優先順序:

1) vectorization2) using a custom cython routine3) apply
    a) reductions that can be performed in cython
    b) iteration in python space4) itertuples5) iterrows6) updating an empty frame (e.g. using loc one-row-at-a-time)

使用自定義cython例程通常太復雜了,所以現在我們跳過它。

1)矢量化永遠是第一選擇,也是最好的選擇。然而,有一小部分病例無法以明顯的方式向量化(大多涉及復發)。此外,在一個較小的框架內,做其他方法可能會更快。

3)申請涉及能,會,可以通常由Cython空間中的迭代器完成(這是在熊貓內部完成的)(這是一個例子)。

這取決于應用表達式中發生的事情。G.df.apply(lambda x: np.sum(x))很快就會被執行(當然df.sum(1)甚至更好)。然而,類似于:df.apply(lambda x: x['b'] + 1)將在python空間中執行,因此速度更慢。

4) itertuples不將數據裝箱到Series中,只需將其作為元組返回即可

5) iterrows將數據放入“系列”中。除非您真的需要這樣做,否則請使用另一種方法。

(6)在時間上更新空幀a-單行。我見過這種方法使用得太多了。這是迄今為止最慢的。它可能是常見的地方(對于某些python結構來說也是相當快的),但是DataFrame對索引做了相當多的檢查,所以每次更新一行總是非常慢的。更好的方法是創建新的結構concat.


查看完整回答
反對 回復 2019-06-09
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

Numpy和大熊貓的病媒操作是快得多比vanillaPython中的標量操作有以下幾個原因:

  • 攤銷式查找:Python是一種動態類型化語言,因此數組中的每個元素都有運行時開銷。然而,Numpy(因此也是熊貓)用C進行計算(通常是通過Cython)。數組的類型只有在迭代開始時才能確定;僅這一節省就是最大的勝利之一。

  • 更好的緩存在C數組上迭代是對緩存友好的,因此非常快。熊貓DataFrame是一個“面向列的表”,這意味著每個列實際上只是一個數組。因此,您可以在DataFrame上執行的本機操作(比如對列中的所有元素進行求和)將很少有緩存丟失。

  • 更多并行的機會一個簡單的C數組可以通過SIMD指令操作。Numpy的某些部分支持SIMD,這取決于您的CPU和安裝過程。并行化的好處不會像靜態類型和更好的緩存那樣引人注目,但它們仍然是一個堅實的勝利。

故事的寓意:在Numpy和熊貓中使用向量運算。它們比Python中的標量操作更快,原因很簡單,因為這些操作正是C程序員手工編寫的操作。(只不過數組概念比嵌入SIMD指令的顯式循環更容易讀取。)


查看完整回答
反對 回復 2019-06-09
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

這是解決你問題的方法。這都是矢量化的。


In [58]: df = table1.merge(table2,on='letter')


In [59]: df['calc'] = df['number1']*df['number2']


In [60]: df

Out[60]: 

  letter  number1  number2  calc

0      a       50      0.2    10

1      a       50      0.5    25

2      b      -10      0.1    -1

3      b      -10      0.4    -4


In [61]: df.groupby('letter')['calc'].max()

Out[61]: 

letter

a         25

b         -1

Name: calc, dtype: float64


In [62]: df.groupby('letter')['calc'].idxmax()

Out[62]: 

letter

a         1

b         2

Name: calc, dtype: int64


In [63]: df.loc[df.groupby('letter')['calc'].idxmax()]

Out[63]: 

  letter  number1  number2  calc

1      a       50      0.5    25

2      b      -10      0.1    -1


查看完整回答
反對 回復 2019-06-09
  • 3 回答
  • 0 關注
  • 467 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號