Какой самый быстрый способ инициализации целочисленного массива в Python? - PullRequest
3 голосов
/ 09 июля 2010

Скажем, я хотел создать массив (НЕ список) из 1000000 пар в Python, например:

array = [2, 2, 2, ...... , 2]

Какой бы быстрый, но простой способ сделать это?

Ответы [ 6 ]

12 голосов
/ 10 июля 2010

В настоящее время принятый ответ НЕ является самым быстрым способом использования array.array; по крайней мере, это не самое медленное - сравните это:

[source: johncatfish (quoting chauncey), Bartek]
python -m timeit -s"import array" "arr = array.array('i', (2 for i in range(0,1000000)))"
10 loops, best of 3: 543 msec per loop

[source: g.d.d.c]
python -m timeit -s"import array" "arr = array.array('i', [2] * 1000000)"
10 loops, best of 3: 141 msec per loop

python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000"
100 loops, best of 3: 15.7 msec per loop

Это соотношение около 9 к 1 ...

7 голосов
/ 09 июля 2010

Это то, что вы ищете?

# slower.
twosArr = array.array('i', [2] * 1000000)

# faster.
twosArr = array.array('i', [2]) * 1000000

Вы можете получить просто список с этим:

twosList = [2] * 1000000

- РЕДАКТИРОВАНИЕ -

Iобновил это, чтобы отразить информацию в другом ответе.Может показаться, что вы можете увеличить скорость в соотношении ~ 9: 1, немного изменив синтаксис.Полный кредит принадлежит @ Джон-Мачин.Я не знал, что вы могли бы умножить объект массива так же, как вы могли бы сделать со списком.

3 голосов
/ 09 июля 2010

Используя модуль timeit , вы можете выяснить, что самое быстрое делает это:

Во-первых, размещение в списке такого количества цифр, скорее всего, убьет вашу машину, поскольку она сохранит ее в памяти.

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

timeit.Timer('[2] * 1000000').timeit()

Другой возможный вариант - использовать модуль array , как указано, efficient arrays of numeric values

array.array('i', (2 for i in range(0, 1000000)))

Я не проверял время завершения обоих, но я уверен, что модуль array, предназначенный для наборов номеров, будет быстрее.

Редактировать: Еще интереснее, вы можете взглянуть на numpy , который на самом деле кажется самым быстрым:

from numpy import *
array( [2 for i in range(0, 1000000)])

Еще быстрее из комментариев:

a = 2 * ones(10000000)

Awesmoe!

2 голосов
/ 21 мая 2013

Гибридный подход работает для меня быстрее всего

$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000"
100 loops, best of 3: 5.38 msec per loop

$ python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000"
10 loops, best of 3: 20.3 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10) * 100000"
100 loops, best of 3: 6.69 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000"
100 loops, best of 3: 5.38 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000) * 1000"
100 loops, best of 3: 5.47 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*10000) * 100"
100 loops, best of 3: 6.13 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*100000) * 10"
10 loops, best of 3: 14.9 msec per loop
$ python -m timeit -s"import array" "arr = array.array('i', [2]*1000000)"
10 loops, best of 3: 77.7 msec per loop
1 голос
/ 09 июля 2010
aList = [2 for x in range(1000000)]

или база по ссылке Чонси

anArray =array.array('i', (2 for i in range(0,1000000)))
0 голосов
/ 21 мая 2016

Если начальное значение не должно быть ненулевым, и если на вашей платформе есть / dev / zero, следующее примерно в 4,7 раза быстрее, чем размер массива ('L', [0]) *решение:

myarray = array.array('L')
f = open('/dev/zero', 'rb')
myarray.fromfile(f, size)
f.close()

В вопросе Как инициализировать целочисленный объект array.array с нулями в Python Я ищу лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...