[英]What is the best way to reset (re-initialize) a list of integers (to 0) in Python
給定一個固定大小 ( n
) 的整數列表 ( list_nb
),將所有值重置(重新初始化)為 0 的最佳方法是什么。
我已經嘗試了兩種方法,1)使用循環來一個一個地重置所有元素,2)一個具有相同大小的新列表(所有元素都為 0)。
第二種方法顯然在執行時間方面給出了更好的結果。
import time
n = 200_000_000
list_nb = [0]*n
# some lines of code that change the list_nb ....
# method 1 to reset
start_time = time.time()
for i in range(len(list_nb)):
list_nb[i] = 0
end_time = time.time()
print("Method 1 time = ",end_time-start_time," s")
# method 2 to reset
start_time = time.time()
list_nb = [0]*n
end_time = time.time()
print("Method 2 time = ",end_time-start_time," s")
結果:
我不知道是否還有其他方法可以做到這一點。
謝謝。
方法2在速度上顯然更勝一籌,對於熟悉Python序列乘法的人來說很容易理解。 警告:它不會重置list
的內容; 它正在制作一個全新的list
並將名稱重新綁定到該新list
。 因此,如果list_nb
是 function 的參數,則不會更改調用者的list
副本。 如果這就是您想要的,很好,但是如果您想更改內容,請將其更改為:
list_nb[:] = [0]*n # Or itertools.repeat(0, n), though CPython doesn't speed it up
它使用切片分配來替換現有list
的內容。 它花費的時間大約是list_nb = [0]*n
的兩倍(它構建一個新list
,從中復制,然后將其丟棄),但是如果您需要就地突變,這是值得的。
我認為最好的方法是像在方法 #2 中那樣覆蓋列表。 覆蓋現有列表比用 0 替換列表中的每個元素更容易。我相信沒有更快的方法可以做到這一點,但我可能錯了。 不錯的工作 !
使用 numpy 非常快。
import numpy as np
import time
n= 200000000
start_time = time.time()
list_nb = np.zeros(n)
end_time = time.time()
print(end_time-start_time)
這需要我0.003000497817993164
如果您准備好使用 numpy:
start_time = time.time()
a = numpy.zeros(n, dtype=object)
end_time = time.time()
print("Method 0 time = ",end_time-start_time," s")
給
('Method 0 time = ', 0.8265918731689453, ' s')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.