Зарезервировать память для списка в Python?

Несмотря на то, что у этого есть много ответов, которые, я считаю, помогут:

const newArray = [ ...new Set( [...arr1, ...arr2] ) ]

В вопросе о том, как будет выглядеть структура массива, не сказано, поэтому, если вы точно знаете, что у вас не будет вложенных массивов или объектов в вашем массиве (это случилось со мной, поэтому я пришел к этому ответу), этот код будет работать.

Что происходит, так это то, что мы используем оператор спреда (...) для согласования обоих массивов, затем мы используем Set для устранения любых дубликатов. Если у вас есть это, вы можете сравнить их размеры, если все три массива имеют одинаковый размер, вы можете пойти.

Этот ответ также игнорирует порядок элементов, как я уже сказал, точная ситуация со мной , так что, может быть, кто-то в той же ситуации может оказаться здесь (как и я).


Edit1.

Отвечая на вопрос Дмитрия Гринько: «Почему вы использовали оператор спреда ( ...) здесь - ... новый набор? Он не работает »

Рассмотрим этот код:

const arr1 = [ 'a', 'b' ]
const arr2 = [ 'a', 'b', 'c' ]
const newArray = [ new Set( [...arr1, ...arr2] ) ]
console.log(newArray)

Вы получите

[ Set { 'a', 'b', 'c' } ]

Чтобы работать с этим значением, вам нужно будет использовать некоторые свойства Set (см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set ). С другой стороны, когда вы используете этот код:

const arr1 = [ 'a', 'b' ]
const arr2 = [ 'a', 'b', 'c' ]
const newArray = [ ...new Set( [...arr1, ...arr2] ) ]
console.log(newArray)

Вы получите

[ 'a', 'b', 'c' ]

В этом разница, первая даст мне набор, он будет работать так как я мог бы получить размер этого набора, но последний дает мне массив, в котором я нуждаюсь, что более прямо относится к разрешению.

44
задан dsimcha 12 February 2009 в 00:52
поделиться

5 ответов

Вот четыре варианта:

  • возрастающее создание списка
  • "предварительно выделенный" список
  • array.array ()
  • numpy.zeros ()

 

python -mtimeit -s"N=10**6" "a = []; app = a.append;"\
    "for i in xrange(N):  app(i);"
10 loops, best of 3: 390 msec per loop

python -mtimeit -s"N=10**6" "a = [None]*N; app = a.append;"\
    "for i in xrange(N):  a[i] = i"
10 loops, best of 3: 245 msec per loop

python -mtimeit -s"from array import array; N=10**6" "a = array('i', [0]*N)"\
    "for i in xrange(N):" "  a[i] = i"
10 loops, best of 3: 541 msec per loop

python -mtimeit -s"from numpy import zeros; N=10**6" "a = zeros(N,dtype='i')"\
    "for i in xrange(N):" "  a[i] = i"
10 loops, best of 3: 353 msec per loop

Это показывает, что [None]*N является самым быстрым, и array.array является самым медленным в этом случае.

34
ответ дан jfs 23 September 2019 в 11:47
поделиться

В большей части повседневного кода Вам не будет нужна такая оптимизация.

Однако, когда эффективность списка становится проблемой, первая вещь, необходимо сделать, заменить универсальный список введенным от array модуль , который намного более эффективен.

Вот то, как список 4 миллионов чисел с плавающей точкой cound быть созданным:

import array
lst = array.array('f', [0.0]*4000*1000)
5
ответ дан Alexander Lebedev 23 September 2019 в 11:47
поделиться

можно создать список известной длины как это:

>>> [None] * known_number
13
ответ дан SilentGhost 23 September 2019 в 11:47
поделиться

Если Вы желаете управлять числами эффективно в Python, затем взглянули на NumPy ( http://numpy.scipy.org/ ). Это позволяет нам, Вы делаете вещи чрезвычайно быстро при тихом получении для использования Python.

, Чтобы сделать то, что Ваше выяснение в NumPy Вы сделали бы что-то как

import numpy as np
myarray = np.zeros(4000)

, который даст Вам массив чисел с плавающей точкой, инициализированных для обнуления. Можно затем сделать, очень прохладным вещам нравится, умножают целые массивы на единственный фактор или на другие массивы и другой материал (отчасти как в Matlab, если Вы когда-либо использовали это), который очень быстр (большая часть фактической работы происходит в высоко оптимизированной части C библиотеки NumPy).

, Если это не массивы чисел Ваш после затем, Вы, вероятно, не собираетесь находить способ сделать то, что Вы хотите в Python. Список Python объектов является списком точек к объектам внутренне (я думаю так так или иначе, я не эксперт внутренностей Python), таким образом, он все еще выделил бы каждого из своих участников, поскольку Вы создаете их.

4
ответ дан Thomas Parslow 23 September 2019 в 11:47
поделиться

В Python все объекты выделяются на "куче".
, Но Python использует специальное средство выделения памяти, таким образом malloc не будет назван каждый раз, когда Вам нужен новый объект.
существует также некоторая оптимизация для маленьких целых чисел (и т.п.), которые кэшируются; однако, который вводит, и как, является зависящим от реализации.

2
ответ дан bernie 23 September 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: