recorrer - Cómo inicializar un objeto entero array.array con ceros en Python
operaciones con matrices en python (0)
Las preguntas con títulos similares son sobre listas de Python o NumPy. Se trata de la parte de la clase array.array de la biblioteca estándar de Python, consulte https://docs.python.org/2/library/array.html
El enfoque de ayuno que se me ocurrió (para tipos enteros) es usar array.fromfile con / dev / zero. Esto es
- aproximadamente 27 veces más rápido que array.array (tamaño ''L'', [0] *), que requiere temporalmente más del doble de memoria que para la matriz final,
- aproximadamente 4.7 veces más rápido que arrar.array (''L'', [0]) * tamaño
- y más de 200 veces más rápido que usar un objeto iterable personalizado (para evitar la creación de una gran lista temporal).
Sin embargo, / dev / zero puede no estar disponible en algunas plataformas. ¿Hay una mejor manera de hacerlo sin NumPy, módulos no estándar o mi propia extensión c?
Código de la demostración
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