簡體   English   中英

在 Python 中重置(重新初始化)整數列表(為 0)的最佳方法是什么

[英]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")

結果:

  • 方法 1 時間 = 16.05620765686035 秒
  • 方法 2 時間 = 1.279524564743042 秒

我不知道是否還有其他方法可以做到這一點。

謝謝。

方法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.

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