簡體   English   中英

為什么加法賦值比賦值慢很多?

[英]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*2x=2*2更廣泛是很正常的,即使只是稍微如此。

暫無
暫無

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

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