[英]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.