[英]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.