繁体   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