Création de fichiers binaires aléatoires
Je suis en train d'utiliser python pour créer un fichier binaire aléatoire. C'est ce que j'ai déjà:
f = open(filename,'wb')
for i in xrange(size_kb):
for ii in xrange(1024/4):
f.write(struct.pack("=I",random.randint(0,sys.maxint*2+1)))
f.close()
Mais c'est terriblement lent (0.82 secondes pour size_kb=1024 sur mon 3.9 GHz SSD disque de la machine). Un gros goulot d'étranglement semble être aléatoire int génération (en remplacement de la randint() avec un 0 réduit le temps d'exécution de 0,82 s à 0,14 s).
Maintenant, je sais qu'il y a des moyens plus efficaces de création aléatoire de fichiers de données (à savoir le dd if=/dev/urandom) mais je vais essayer de trouver cela pour l'intérêt de la curiosité... est-il une façon évidente pour les améliorer?
source d'informationauteur gardarh
Vous devez vous connecter pour publier un commentaire.
À mon humble avis - la suite est complètement redondant:
Il n'y a absolument pas besoin d'utiliser
struct.pack
il suffit de faire quelque chose comme:Alors, si vous avez besoin de ré-utiliser le fichier pour la lecture des nombres entiers, alors
struct.unpack
ensuite.Une autre option est de simplement écrire un UUID4 pour le fichier, mais je ne sais pas exactement de cas d'utilisation, je ne suis pas sûr que ce soit viable.
Le code python, vous devez écrire dépend entièrement de la façon dont vous souhaitez utiliser le hasard fichier binaire. Si vous avez juste besoin d'un "assez bon" hasard à des fins multiples, puis le code de Jon Clements est probablement le meilleur.
Cependant, sur le système d'exploitation Linux au moins, os.urandom s'appuie sur /dev/urandom, qui est décrit dans le Noyau Linux (drivers/char/aléatoire.c) comme suit:
La question est donc, est-ce acceptable pour votre application ? Si vous préférez une plus sécurisé RNG, vous pouvez lire des octets sur /dev/random à la place. Le principal inconvénient de ce dispositif: il peut bloquer indéfiniment si le noyau Linux n'est pas en mesure de recueillir suffisamment d'entropie. Il y a aussi d'autres cryptographique sécurisé Rng comme EGD.
Alternativement, si votre principale préoccupation est la vitesse d'exécution et, si vous le besoin juste de la "lumière de l'aléatoire" pour un type Monte-Carlo (j'.e imprévisibilité n'a pas d'importance, la distribution uniforme), vous pourriez envisager de générer votre fichier binaire aléatoire une fois et l'utiliser plusieurs fois, au moins pour le développement.