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 vermeiden

Auf 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

Antworten auf die Frage(0)

Ihre Antwort auf die Frage