Сохранить память для списка в Python?

При программировании на Python можно зарезервировать память для списка, который будет заполнен известным количеством элементов, чтобы список не перераспределялся несколько раз при его создании? Я просмотрел документы для типа списка Python и не нашел ничего похожего на это. Однако этот тип списка создается в нескольких горячих точках моего кода, поэтому я хочу сделать его максимально эффективным.

Edit: Кроме того, имеет ли смысл делать что-то подобное на языке Python? Я довольно опытный программист, но новичок в Python и все еще чувствую, как он работает. Является ли Python внутренне распределять все объекты в отдельных пространствах кучи, преследуя цель попытаться минимизировать выделение или примитивы, такие как int, float и т. Д., Хранящиеся непосредственно в списках?

  • Почему преобразование списка в набор быстрее, чем просто список для вычисления разницы в списках?
  • Python - список списков списков в столбцах
  • Получить список номеров в качестве ввода от пользователя
  • Преобразование строкового представления списка в фактический объект списка
  • Булевое значение пустого списка
  • Как преобразовать список строк в целое число в python
  • Как список итераций списков работает в python?
  • изменять списки, удаляя элементы без создания беспорядка
  • Инициализация 2D-массива в Python
  • Неподдерживаемый тип (ы) операндов для +: 'int' и 'str'
  • Лучший способ проверить, присутствует ли элемент в списке списков?
  • Сортировка элементов словаря в списке
  • 7 Solutions collect form web for “Сохранить память для списка в Python?”

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

    • создание инкрементного списка
    • «предварительно выделенный» список
    • 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 является самым медленным в этом случае.

    вы можете создать список известной длины следующим образом:

     >>> [None] * known_number 

    Взгляните на это:

     In [7]: %timeit array.array('f', [0.0]*4000*1000) 1 loops, best of 3: 306 ms per loop In [8]: %timeit array.array('f', [0.0])*4000*1000 100 loops, best of 3: 5.96 ms per loop In [11]: %timeit np.zeros(4000*1000, dtype='f') 100 loops, best of 3: 6.04 ms per loop In [9]: %timeit [0.0]*4000*1000 10 loops, best of 3: 32.4 ms per loop 

    Поэтому никогда не используйте array.array('f', [0.0]*N) , используйте array.array('f', [0.0])*N или numpy.zeros .

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

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

    Вот как создается список из 4 миллионов чисел чисел с плавающей запятой:

     import array lst = array.array('f', [0.0]*4000*1000) 

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

    Чтобы сделать то, что ваш запрос в NumPy, вы сделали бы что-то вроде

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

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

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

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

    Просто создайте список в начале следующим образом:

     a = range(10) 

    Затем вы можете назначать значения, записывающие

     a[7] = an object 
    Python - лучший язык программирования в мире.