簡體   English   中英

pandas.Series.div()與/ =

[英]pandas.Series.div() vs /=

我很好奇為什么將pandas.Series.div()應用於/ pandas系列數字時比/ =慢。 例如:

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser /= 7'
1000 loops, best of 3: 584 usec per loop

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser.div(7)'
1000 loops, best of 3: 746 usec per loop

我認為這是因為前者將系列更改到位,而后者返回了新的系列。 但是如果是這樣的話,那么如果它們不如/ =和* /一樣快,為什么還要麻煩地實現div()和mul()呢? 即使您不想更改序列,ser / 7仍然比.div()快:

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser / 7'
1000 loops, best of 3: 656 usec per loop

那么pd.Series.div()的用途是什么,它會使它變慢嗎?

熊貓.div顯然類似於//=實現除法。

擁有單獨的.div是Pandas包含了一種語法模型,其中對數據幀的操作由連續過濾器 (例如.div.str等)的應用來描述,該過濾器允許簡單的串聯:

ser.div(7).apply(lambda x: 'text: ' + str(x)).str.upper()

以及對多個參數的更簡單支持(使用二進制運算符無法編寫.func(a, b, c) )。

相比之下,如果沒有div ,則將被寫為:

(ser / 7).apply(lambda x: 'text: ' + str(x)).str.upper()

/操作可能更快,因為與.div()相比,與/運算符關聯的Python開銷更少。

相反, x /= y運算符替換了結構x = x / y 對於基於NumPy的矢量化容器(如Pandas),它超出了一點:它使用就地操作而不是創建x副本(可能會浪費時間和內存)。 這就是/=/.div()都快的原因。

請注意,雖然在大多數情況下這是等效的,但有時(如在這種情況下)它仍需要轉換為其他數據類型,這在Pandas中自動完成(但在NumPy中不是自動完成)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM