J'aimerais créer une liste aléatoire d'entiers à des fins de test. La distribution des nombres n'est pas importante. La seule chose qui compte est temps . Je sais que la génération de nombres aléatoires est une tâche qui prend du temps, mais il doit y avoir un meilleur moyen.
Voici ma solution actuelle :
import random
import timeit
# Random lists from [0-999] interval
print [random.randint(0, 1000) for r in xrange(10)] # v1
print [random.choice([i for i in xrange(1000)]) for r in xrange(10)] # v2
# Measurement:
t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1
t2 = timeit.Timer('random.sample(range(1000), 10000)', 'import random') # v2
print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
La v2 est plus rapide que la v1, mais elle ne fonctionne pas à une si grande échelle. Elle donne l'erreur suivante :
ValueError : échantillon plus grand que la population
Existe-t-il une solution rapide et efficace qui fonctionne à cette échelle ?
Quelques résultats de la réponse
Celle d'Andrew : 0.000290962934494
de gnibbler : 0.0058455221653
KennyTM's : 0.00219276118279
NumPy est venu, a vu, et a conquis.
4 votes
Bien sûr que ça ne marche pas.
random.sample()
appauvrit la population, rendant les chiffres de moins en moins aléatoires. Une fois que la population entière est épuisée, il est impossible d'échantillonner davantage.0 votes
Quand vous dites que c'est à des fins de test, combien de temps dureront les tests ?
0 votes
Pour les simulations, où le temps est un impératif (mais pas la cryptographie ni la sécurité), une Générateur contructif linéaire (LCG) est souvent utilisé. Je crois qu'un Twister de Mersenne est rapide (mais plus lent que LCG), et il fournit une distribution uniforme, si je me souviens bien.