Я использую Consolas на своем Mac, BTW; вот ссылка для загрузки файлов консолей TTF , если Вы хотите установить этот (Mac/победа/Linux).
/ член парламента
Если вас не устраивают списки (потому что они могут содержать что угодно и занимать слишком много памяти), вы можете использовать эффективный массив целых чисел:
import array
array.array('i')
См. здесь
Если вам нужно его инициализировать,
a = array.array('i',(0 for i in range(0,10)))
двумя способами:
x = [0] * 10
x = [0 for i in xrange(10)]
Изменить: заменить диапазон
на xrange
, чтобы избежать создания другого списка.
Также: как отметили многие другие включая Пи и Бена Джеймса, это создает список
, а не массив Python. Хотя список во многих случаях достаточен и достаточно прост, для критически важных задач (например, при дублировании в тысячах объектов) вы можете изучить массивы Python. Найдите модуль array
, как описано в других ответах в этой теме.
>>> a = [0] * 10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
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.
Используйте модуль 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
строится быстрее, чем метод массива. Иди разберись! :)
a = 10 * [0]
дает массив длиной 10, заполненный нулями.
Если вам нужно быстро инициализировать массив, вы можете делать это блоками, а не с помощью инициализатора генератора, и это будет намного быстрее. Создание списка с помощью [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]