为列表分配内存

4

当我已经知道列表最终的大小时,我能否设置list的容量?我试图避免Python在向其添加项目时重新分配内存。

在构造函数中,设置capacitysizelengthlen是不起作用的。

def merge_lists(a, b):
    result = list(capacity=len(a) + len(b))
    ...

编辑:……无需实际添加任何元素。


3
相关的值得查看的内容:Python - 创建具有初始容量的列表 - jedwards
如果你真的在寻找速度,考虑使用numpy进行数值数组操作或者使用“类C”的数值数组:https://docs.python.org/2/library/array.html - Shashank
你确定要这样做吗?对我来说,这感觉像是过早的优化。 - Akavall
考虑一个固定大小的双端队列。我不能确定它是否会提供任何优化。 - Paul Rooney
2个回答

4

假设您想要10个元素,可以这样做:

l = [None] * 10

或者

l = range(10)

好的,但是我需要这个列表为空。 - R2-D2
使用 [None] * 10 基本上创建了一个空列表,因为 None 提供了这个功能。(“将变量赋值为 None 是将其重置为原始的空状态的一种方法。”) - Alexandru Godri
1
似乎OP想要类似于C++中向量的reserve功能,可以为例如10个元素保留内存,而不影响向量的大小。我们两个解决方案都表明列表具有长度,因为它们实际上不是空的。 - Marcin
是的,但在执行 l.append(42) 后,l.index(42) 的结果将为 10 而不是 0 - R2-D2
事实上,在C++中,您可以使用malloc来创建动态大小的对象。在Python中,您没有同样的自由。我认为这是您可以得到的最好的结果。 - Alexandru Godri

1
我认为你可以尽可能接近这个:
In [1]: result = [0]*100

In [2]: len(result)
Out[2]: 100

这将使结果保持100个元素,在您对其进行任何操作之前。

好的,但我需要列表为空。 - R2-D2
所以,答案很可能是不行的。Python不像C++一样可以自己管理内存分配。可能有一些非标准容器,例如blist,可以做到这一点。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接