So initialisieren Sie ein ganzzahliges array.array-Objekt mit Nullen in Python
Fragen mit ähnlichen Titeln beziehen sich auf Python-Listen oder NumPy. Hier geht es um den array.array-Klassenteil der Standard-Python-Bibliothek, siehehttps: //docs.python.org/2/library/array.htm
Der schnellste Ansatz, den ich (für Integer-Typen) gefunden habe, ist die Verwendung von array.fromfile mit / dev / zero. Das is
ungefähr 27-mal schneller als array.array ('L', [0] * Größe), was zeitweise mehr als den doppelten Speicherplatz als für das endgültige Array erfordert, ungefähr 4,7 mal schneller als arrar.array ('L', [0]) * sizend über 200-mal schneller als die Verwendung eines benutzerdefinierten iterierbaren Objekts (um das Erstellen einer großen temporären Liste zu vermeidenAuf einigen Plattformen ist / dev / zero jedoch möglicherweise nicht verfügbar. Gibt es einen besseren Weg, dies ohne NumPy, Nicht-Standard-Module oder meine eigene C-Extension zu tun?
Demonstrator-Code:
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