我試驗Counter.__iadd__并Counter.update累積了 10,000 個計數器,結果證明__iadd__需要 1.8 秒才能完成,而update只需要 36 毫秒。我想知道為什么__iadd__要花這么多時間。我猜它首先創建一個新對象并將該對象復制到自身。但它為什么要這樣做呢?不是到位了嗎?我不知道為什么它不使用與update.這是我在 IPython 中的實驗:[ins] In [11]: def update(): ...: a = Counter() ...: for i in range(10000): ...: a.update(Counter([i])) ...: ...: %time update()CPU times: user 36 ms, sys: 0 ns, total: 36 msWall time: 33.3 ms[nav] In [12]: def iadd(): ...: a = Counter() ...: for i in range(10000): ...: a.__iadd__(Counter([i])) ...: ...: %time iadd()CPU times: user 1.8 s, sys: 0 ns, total: 1.8 sWall time: 1.8 s
1 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
你的假設是不正確的。__iadd__
不會創建新的計數器。
速度變慢是因為多重集運算符collections.Counter
?過濾掉了非正計數的條目,這需要每次都遍歷整個計數器:
提供了幾種數學運算,用于組合 Counter 對象以生成多重集(計數大于零的計數器)。加法和減法通過添加或減去相應元素的計數來組合計數器。交集和并集返回相應計數的最小值和最大值。每個操作都可以接受帶符號計數的輸入,但輸出將排除計數為零或更少的結果。
update
不那樣做。
此外,__iadd__
是一個用于覆蓋+=
行為的掛鉤。您幾乎不應該手動調用它;你應該使用+=
(或者update
,在這種情況下,或者只是a[i] += 1
)。
添加回答
舉報
0/150
提交
取消