Как создать целочисленный массив в Python?

Я использую Consolas на своем Mac, BTW; вот ссылка для загрузки файлов консолей TTF , если Вы хотите установить этот (Mac/победа/Linux).

/ член парламента

29
задан PythontoBeLoved 7 December 2009 в 13:08
поделиться

7 ответов

Если вас не устраивают списки (потому что они могут содержать что угодно и занимать слишком много памяти), вы можете использовать эффективный массив целых чисел:

import array
array.array('i')

См. здесь

Если вам нужно его инициализировать,

a = array.array('i',(0 for i in range(0,10)))
25
ответ дан 28 November 2019 в 01:06
поделиться

двумя способами:

x = [0] * 10
x = [0 for i in xrange(10)]

Изменить: заменить диапазон на xrange , чтобы избежать создания другого списка.

Также: как отметили многие другие включая Пи и Бена Джеймса, это создает список , а не массив Python. Хотя список во многих случаях достаточен и достаточно прост, для критически важных задач (например, при дублировании в тысячах объектов) вы можете изучить массивы Python. Найдите модуль array , как описано в других ответах в этой теме.

27
ответ дан 28 November 2019 в 01:06
поделиться
>>> a = [0] * 10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9
ответ дан 28 November 2019 в 01:06
поделиться
import random

def random_zeroes(max_size):
  "Create a list of zeros for a random size (up to max_size)."
  a = []
  for i in xrange(random.randrange(max_size)):
    a += [0]

Используйте диапазон вместо этого, если вы используете Python 3.x.

1
ответ дан 28 November 2019 в 01:06
поделиться

Используйте модуль array . С его помощью вы можете эффективно хранить коллекции одного и того же типа.

>>> import array
>>> import itertools
>>> a = array_of_signed_ints = array.array("i", itertools.repeat(0, 10))

Для получения дополнительной информации - например, различных типов, посмотрите документацию модуля массива . Для 1 миллиона записей это должно быть довольно быстро. Для 10 миллионов записей моя локальная машина думает 1,5 секунды.

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

Вы используете его как список:

>>> a.append(1)
>>> a.extend([1, 2, 3])
>>> a[-4:]
array('i', [1, 1, 2, 3])
>>> len(a)
14

... или просто конвертируете его в список:

>>> l = list(a)
>>> len(l)
14

Удивительно, но

>>> a = [0] * 10000000

строится быстрее, чем метод массива. Иди разберись! :)

6
ответ дан 28 November 2019 в 01:06
поделиться
a = 10 * [0]

дает массив длиной 10, заполненный нулями.

1
ответ дан 28 November 2019 в 01:06
поделиться

Если вам нужно быстро инициализировать массив, вы можете делать это блоками, а не с помощью инициализатора генератора, и это будет намного быстрее. Создание списка с помощью [0] * count выполняется так же быстро, как и раньше.

import array

def zerofill(arr, count):
    count *= arr.itemsize
    blocksize = 1024
    blocks, rest = divmod(count, blocksize)
    for _ in xrange(blocks):
        arr.fromstring("\x00"*blocksize)
    arr.fromstring("\x00"*rest)

def test_zerofill(count):
    iarr = array.array('i')
    zerofill(iarr, count)
    assert len(iarr) == count

def test_generator(count):
    iarr = array.array('i', (0 for _ in xrange(count)))
    assert len(iarr) == count

def test_list(count):
    L = [0]*count
    assert len(L) == count

if __name__ == '__main__':
    import timeit
    c = 100000
    n = 10
    print timeit.Timer("test(c)", "from __main__ import c, test_zerofill as test").repeat(number=n)
    print timeit.Timer("test(c)", "from __main__ import c, test_generator as test").repeat(number=n)
    print timeit.Timer("test(c)", "from __main__ import c, test_list as test").repeat(number=n)

Результаты:

(array in blocks) [0.022809982299804688, 0.014942169189453125, 0.014089107513427734]
(array with generator) [1.1884641647338867, 1.1728270053863525, 1.1622772216796875]
(list) [0.023866891860961914, 0.035660028457641602, 0.023386955261230469]
1
ответ дан 28 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

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