Как инициализировать целочисленный объект array.array с нулями в Python
Вопросы с похожими заголовками касаются списков Python или NumPy. Это о части класса array.array стандартной библиотеки Python, см.https://docs.python.org/2/library/array.html
Быстрый подход, который я придумал (для целочисленных типов), заключается в использовании array.fromfile с / dev / zero. Это
примерно в 27 раз быстрее, чем array.array ('L', [0] * size), который временно требует более чем вдвое больше памяти, чем для окончательного массива,примерно в 4,7 раза быстрее, чем arrar.array ('L', [0]) * sizeи более чем в 200 раз быстрее, чем использование настраиваемого итерируемого объекта (чтобы избежать создания большого временного списка).Однако / dev / zero может быть недоступен на некоторых платформах. Есть ли лучший способ сделать это без NumPy, нестандартных модулей или моего собственного c-расширения?
Код демонстратора:
import array
import sys
import time
size = 100 * 1000**2
test = sys.argv[1]
class ZeroIterable:
def __init__(self, size):
self.size = size
self.next_index = 0
def next(self):
if self.next_index == self.size:
raise StopIteration
self.next_index = self.next_index + 1
return 0
def __iter__(self):
return self
t = time.time()
if test == 'Z':
myarray = array.array('L')
f = open('/dev/zero', 'rb')
myarray.fromfile(f, size)
f.close()
elif test == 'L':
myarray = array.array('L', [0] * size)
elif test == 'S':
myarray = array.array('L', [0]) * size
elif test == 'I':
myarray = array.array('L', ZeroIterable(size))
print time.time() - t