簡體   English   中英

Python串聯與列表上的追加速度

[英]Python concatenation vs append speed on lists

從interactivepython.org獲取以下代碼片段:

def test1():  # concat
    l = []
    for i in range(1000):
        l = l + [i]

def test2():  # append
    l = []
    for i in range(1000):
        l.append(i)

concat  6.54352807999 milliseconds
append  0.306292057037 milliseconds

最底層的是運行時間。

它說串聯是O(k),其中k是“要串聯的列表的長度”。 我不確定這是否意味着要添加到的列表(原始)或要添加的列表。 但是在這兩個循環中,似乎您每次迭代僅執行1個步驟。 那么為什么追加速度這么快?

如果將test1更改為:

def test1():  # concat
    l = []
    for i in range(1000):
        l += [i] 

時代會更接近和你實際上是在做什么append是做不每次創建一個新的列表。

In [26]: %timeit test1()
10000 loops, best of 3: 169 µs per loop

In [27]: %timeit test2()
10000 loops, best of 3: 115 µs per loop

如果將print id放在代碼中,您將在test1看到每次都在創建一個新對象,但是在test2它始終是相同的列表:

In [41]: test1()
139758194625352
139758206001808
139758205966960
139758194625352
139758206001808
139758205966960
139758194625352
139758206001808
139758205966960
139758194625352
Out[41]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [42]: test2()
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
139758206002600
Out[42]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

因為串聯必須在每次迭代中構建一個新的列表對象:

每次創建一個新列表都比在現有列表中添加一項昂貴得多。

.append().append()將在C數組中填充預分配的索引,並且列表對象僅需要定期增長該數組。 另一方面,構建新的列表對象必須每次都分配一個C數組。

暫無
暫無

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

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