当前位置: 首页 > 面试题库 >

如何在python中创建固定大小列表?

谯乐池
2023-03-14
问题内容

在C ++中,我可以创建如下数组:

int* a = new int[10];

在python中,我只知道我可以声明一个列表,而不要附加一些项目或类似。

l = [1,2,3,4]
l = range(10)

我可以按给定的大小(如c ++)初始化列表,并且不进行任何赋值吗?


问题答案:

(tl;博士:您问题的确切答案是numpy.emptynumpy.empty_like,但您可能不在乎,可以摆脱使用的困扰myList = [None]*10000。)

您可以将列表初始化为所有相同的元素。使用非数字值在语义上有意义(如果使用它会在以后产生错误,这是一件好事)或类似0的值(不寻常?如果您正在编写稀疏矩阵或’默认值应为0,并且您不必担心错误)由您自己决定:

>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]

(这里_只是一个变量名,您可以使用i。)

您也可以这样:

>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]

您可能不需要优化它。您还可以在每次需要时追加到数组:

>>> x = []
>>> for i in range(10):
>>>    x.append(i)

简单方法的性能比较

哪个最好?

>>> def initAndWrite_test():
...  x = [None]*10000
...  for i in range(10000):
...   x[i] = i
... 
>>> def initAndWrite2_test():
...  x = [None for _ in range(10000)]
...  for i in range(10000):
...   x[i] = i
... 
>>> def appendWrite_test():
...  x = []
...  for i in range(10000):
...   x.append(i)

python2.7中的结果:

>>> import timeit
>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]:
...  print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000))
... 
initAndWrite_test takes 714.596033096 usec/loop
initAndWrite2_test takes 981.526136398 usec/loop
appendWrite_test takes 908.597946167 usec/loop

python 3.2中的结果:

initAndWrite_test takes 641.3581371307373 usec/loop
initAndWrite2_test takes 1033.6499214172363 usec/loop
appendWrite_test takes 895.9040641784668 usec/loop

正如我们所看到的,最好[None]*10000在python2和python3中都做习惯用法。但是,如果执行的工作比分配还要复杂(例如,要生成或处理列表中的每个元素都比较复杂),那么开销将占成本的一小部分。也就是说,如果您对列表中的元素进行任何合理的处理,现在就担心此类优化还为时过早。

未初始化的内存

但是这些都是低效的,因为它们要经过内存,在过程中写一些东西。在C语言中这是不同的:未初始化的数组填充有随机垃圾存储器(注:已从系统重新分配,并且当您分配或无法锁住和/或无法在关闭程序时删除内存时可能存在安全风险))。这是一个旨在提高速度的设计选择:C语言的开发人员认为最好不要自动初始化内存,这是正确的选择。

这不是渐近的加速(因为是O(N)),但是例如,在用实际关心的内容覆盖之前,您不需要先初始化整个内存块。如果可能的话,这等效于(pseudo-
code)之类的东西x = list(size=10000)

如果要在python中使用类似的东西,可以使用numpy数值矩阵/
N维数组操作包。具体来说,numpy.emptynumpy.empty_like

那是您问题的真正答案。



 类似资料:
  • 问题内容: 我想用Java创建一个Stack,但是要固定大小。例如,创建一个新的堆栈,将大小设置为10,然后在将项目推入堆栈时将其填满,并在将其填满到十时将堆栈中的最后一个项目推出(移出)。我想使用Stack,因为它使用LIFO,非常适合我的需求。 但是Stack从Vector继承的setSize()方法似乎并没有真正限制Stack的大小。我想我缺少有关堆栈如何工作的信息,或者堆栈并不是要受到约束

  • 问题内容: 在Swift中,我试图创建一个由64个SKSpriteNode组成的数组。我想先将其初始化为空,然后将Sprites放在前16个单元格中,然后将最后16个单元格中(模拟象棋游戏)。 根据我在文档中了解的内容,我期望会出现以下情况: 要么 但这是行不通的。在第二种情况下,我收到一条错误消息:“尚不支持定长数组”。那可以是真的吗?对我来说,这听起来像是一项基本功能。我需要通过它们的索引直接

  • 问题内容: 我想创建一个可以容纳10个元素的空列表(或最好的方法)。 之后,我想在该列表中分配值,例如,应该显示0到9: 但是,当我运行此代码时,它会产生错误,或者在其他情况下,它只会显示(空)。 有人可以解释为什么吗? 问题答案: 你不能分配给类似的列表,除非该列表已至少已使用元素初始化。你需要使用append将元素添加到列表的末尾。。 (如果使用字典,则可以使用分配符号)。 创建一个空列表:

  • 问题内容: 我想创建一个特定大小的文件(例如1GiB)。内容并不重要,因为我会在其中填充内容。 我正在做的是: 但这需要太长时间才能完成。我花了大约1分钟的时间。有什么可以改善的呢? 问题答案: 警告 此解决方案将提供您可能无法预期的结果。参见UPD … 1创建新文件。 2寻求1个字节的大小。 3写1个字节。 4利润:) UPD: 查找和截断都在我的系统(Linux + ReiserFS)上创建稀

  • 我想创建一个可以容纳10个元素的空列表(或者任何最好的方式)。 然后,我要在该列表中分配值,例如,该列表应该显示0到9: 但当我运行此代码时,它会生成一个错误,或者在另一种情况下,它只显示(空)。 有人能解释为什么吗?

  • 如何创建一个可以容纳10个元素的空列表? 之后,我想在该列表中分配值。例如: 但是,这会导致<code>索引器:列表分配索引超出范围。为什么? 在Python中,列表没有设置的容量,但不可能分配给尚未存在的元素。这里的答案显示了创建一个包含10个“伪”元素的列表的代码,以便稍后替换。然而,大多数遇到这个问题的初学者实际上只是想通过向列表中添加元素来构建列表。这应该使用方法,尽管通常会有特定于问题的