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

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

為什么 Counter.__iadd__ 比 Counter.update 慢那么多?

為什么 Counter.__iadd__ 比 Counter.update 慢那么多?

四季花海 2023-02-22 10:56:59
我試驗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)。


查看完整回答
反對 回復 2023-02-22
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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