第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

熊貓迭代有性能問(wèn)題嗎?

熊貓迭代有性能問(wèn)題嗎?

守候你守候我 2019-06-09 15:22:50
熊貓迭代有性能問(wèn)題嗎?我注意到在使用熊貓的迭代時(shí)表現(xiàn)很差。這是別人經(jīng)歷過(guò)的嗎?它是否特定于迭代,對(duì)于一定大小的數(shù)據(jù)(我正在處理的是2300萬(wàn)行),是否應(yīng)該避免這個(gè)函數(shù)?這次討論在GitHub上,我相信這是在將dtype混合到dataframe中時(shí)引起的,但是下面的簡(jiǎn)單示例顯示,即使使用一個(gè)dtype(Float 64),它也存在。這在我的機(jī)器上需要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為什么像應(yīng)用這樣的向量化操作要快得多?我想一定有一些逐行迭代在那里進(jìn)行。在我的情況下,我不知道如何不使用迭代(這將為將來(lái)的問(wèn)題保留下來(lái))。因此,如果您一直能夠避免此迭代,我將非常感謝您的收聽(tīng)。我是根據(jù)不同數(shù)據(jù)中的數(shù)據(jù)進(jìn)行計(jì)算。謝謝!-編輯:我想運(yùn)行的代碼的簡(jiǎn)化版本添加在下面-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貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

一般來(lái)說(shuō),iterrows應(yīng)該只在非常具體的情況下使用。這是執(zhí)行各種操作的一般優(yōu)先順序:

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例程通常太復(fù)雜了,所以現(xiàn)在我們跳過(guò)它。

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

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

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

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

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

(6)在時(shí)間上更新空幀a-單行。我見(jiàn)過(guò)這種方法使用得太多了。這是迄今為止最慢的。它可能是常見(jiàn)的地方(對(duì)于某些python結(jié)構(gòu)來(lái)說(shuō)也是相當(dāng)快的),但是DataFrame對(duì)索引做了相當(dāng)多的檢查,所以每次更新一行總是非常慢的。更好的方法是創(chuàng)建新的結(jié)構(gòu)concat.


查看完整回答
反對(duì) 回復(fù) 2019-06-09
?
繁花不似錦

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊

Numpy和大熊貓的病媒操作是快得多比vanillaPython中的標(biāo)量操作有以下幾個(gè)原因:

  • 攤銷(xiāo)式查找:Python是一種動(dòng)態(tài)類型化語(yǔ)言,因此數(shù)組中的每個(gè)元素都有運(yùn)行時(shí)開(kāi)銷(xiāo)。然而,Numpy(因此也是熊貓)用C進(jìn)行計(jì)算(通常是通過(guò)Cython)。數(shù)組的類型只有在迭代開(kāi)始時(shí)才能確定;僅這一節(jié)省就是最大的勝利之一。

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

  • 更多并行的機(jī)會(huì)一個(gè)簡(jiǎn)單的C數(shù)組可以通過(guò)SIMD指令操作。Numpy的某些部分支持SIMD,這取決于您的CPU和安裝過(guò)程。并行化的好處不會(huì)像靜態(tài)類型和更好的緩存那樣引人注目,但它們?nèi)匀皇且粋€(gè)堅(jiān)實(shí)的勝利。

故事的寓意:在Numpy和熊貓中使用向量運(yùn)算。它們比Python中的標(biāo)量操作更快,原因很簡(jiǎn)單,因?yàn)檫@些操作正是C程序員手工編寫(xiě)的操作。(只不過(guò)數(shù)組概念比嵌入SIMD指令的顯式循環(huán)更容易讀取。)


查看完整回答
反對(duì) 回復(fù) 2019-06-09
?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

這是解決你問(wèn)題的方法。這都是矢量化的。


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


查看完整回答
反對(duì) 回復(fù) 2019-06-09
  • 3 回答
  • 0 關(guān)注
  • 461 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)