[英]Why is addition assignment is much slower than assignment?
我對提高 python 效率還很陌生。 所以我做了一些測試,比如;
示例 1:
num = 0
num = 2*2
# time: 13.8 ns ± 0.158 ns per loop
示例 2:
num = 0
num += 2*2
# time: 23.8 ns ± 0.232 ns per loop
我想知道為什么使用加法賦值要慢得多,是因為它有加法嗎?
如果您使用 dis 模塊並將所有內容包裝在 function 中,它將變得更加清晰:
import dis
def change_link():
num = 0
num = 2*2
def add():
num = 0
num += 2*2
dis.dis(change_link)
dis.dis(add)
您會看到 change_link() function 的步驟更少:
0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (num)
4 LOAD_CONST 2 (4)
6 STORE_FAST 0 (num)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
而不是 add() function:
0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (num)
4 LOAD_FAST 0 (num)
6 LOAD_CONST 2 (4)
8 INPLACE_ADD
10 STORE_FAST 0 (num)
12 LOAD_CONST 0 (None)
14 RETURN_VALUE
簡而言之,更改值的鏈接比更正(例如加或乘)值要容易得多。
是因為有加法嗎?
是的,附加賦值需要在寫入新值之前從 memory 讀取值,而簡單的賦值不需要這個讀取步驟並且可以直接寫入值,從而使其更快。
好吧,在一種情況下你有 2 個操作:1 個乘法2*2
(假設它在解析時還沒有完成。我真的不知道解釋器的內部。它可能是)和 1 個賦值num=4
.
在另外 3 個中:1 個乘法2*2
,1 個加法num+4
和一個賦值num=4
請注意,該比率在時間上肯定小於 3/2。 因為無論如何,這些可能不是計算中最重的部分。 例如,訪問 memory 需要比加法更長的時間。 另外,還有測量時間。 如果你測量
for i in range(100000000):
x=2*2
您要測量的很大一部分是 for 循環。
因此,計時有很大的共同點。 並且只有一小部分是關於2個操作之間的區別。 3/2(更實際的是 2/1,因為我很確定,雖然對此一無所知,但 python 在解析時將 2*2 替換為 4。即使是我自己的簡單教學解釋器也會這樣做。這是一個基本功能,並且python 解釋器通常不是基本的),因此 3/2 或 2/1 比率僅適用於一小部分計算時間。
但是, x+=2*2
比x=2*2
更廣泛是很正常的,即使只是稍微如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.