2015-03-29 2 views
4

Могу ли я установить емкость list, когда я уже знаю размер, который в конечном итоге будет иметь список? Я пытаюсь избежать перераспределения памяти Python, когда append элементов.Выделить память для списка

В конструкторе, установка capacity, size, length или len не работает.

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

Edit: ... без фактического добавления каких-либо элементов.

+3

Связанные стоит рецензирование: [Python - Создание списка с начальной емкостью] (http://stackoverflow.com/questions/311775/python-create-a-list-with-initial-capacity) – jedwards

+0

Если вы действительно ищете скорость, рассмотрите numpy для числовых массивов или для «C-like» числовых массивов: https: // docs. python.org/2/library/array.html – Shashank

+0

Вы уверены, что хотите это сделать? Мне кажется, что это преждевременная оптимизация. – Akavall

ответ

1

Я думаю, что ближайший вы можете получить это:

In [1]: result = [0]*100 

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

Это позволит сделать результат держать 100 элементов, прежде чем сделать что-нибудь с ним.

+0

ОК, но мне нужно, чтобы список был пустым. –

+0

Итак, ответ, скорее всего, нет. Python не C++, где вы можете самостоятельно управлять распределением памяти. Возможно, есть некоторые нестандартные контейнеры, например. [blist] (https://pypi.python.org/pypi/blist/?), который может это сделать. – Marcin

4

Предполагая, что вы хотите 10 элементов, вы можете сделать:

l = [None] * 10 

или

l = range(10) 
+0

ОК, но мне нужно, чтобы список был пустым. –

+0

Использование [Нет] * 10 в основном создает пустой список, поскольку None предоставляет это. («Присвоение значения None переменной является одним из способов сброса его в исходное, пустое состояние».) –

+0

Кажется, что OP после чего-то вроде резерва в C++ для вектора. Где вы можете зарезервировать память, например. 10 элементов, не влияя на размер вектора. Оба наших решения указывают, что списки имеют длину, поскольку они де-факто не пусты. – Marcin

Смежные вопросы