Muestreo muy rápido de un conjunto con un número fijo de elementos en Python
-
26-10-2019 - |
Pregunta
Necesito probar de manera uniforme al azar un número de un conjunto con tamaño fijo, hacer algún cálculo y volver a poner el nuevo número en el conjunto. (El número de muestras necesarias es muy grande)
Intenté almacenar los números en una lista y usar Random.Choice () para elegir un elemento, eliminarlo y luego agregar el nuevo elemento. ¡Pero eso es demasiado lento!
Estoy pensando en almacenar los números en una matriz Numpy, probar una lista de índices y para cada índice realizar el cálculo.
- ¿Hay alguna forma más rápida de hacer este proceso?
Solución
Las listas de Python se implementan internamente como matrices (como Java ArrayList
S, C ++ std::vector
S, etc.), por lo que eliminar un elemento del medio es relativamente lento: todos los elementos posteriores deben ser reindexados. (Ver http://www.laurentluce.com/posts/python-list-implementation/ Para más información sobre esto.) Dado que el orden de los elementos no parece ser relevante para usted, le recomiendo que simplemente use random.randint(0, len(L) - 1)
para elegir un índice i
, luego usa L[i] = calculation(L[i])
Para actualizar el i
th elemento.
Otros consejos
Necesito probar de manera uniforme al azar un número de un conjunto con tamaño fijo, hacer algún cálculo y volver a poner el nuevo número en el conjunto.
s = list(someset) # store the set as a list
while 1:
i = randrange(len(s)) # choose a random element
x = s[i]
y = your_calculation(x) # do some calculation
s[i] = y # put the new number back into the set
aleatorio.sample (un conjunto o lista o una matriz numpy, nsample) es muy rápido, pero no está claro para mí si quieres algo así:
import random
Setsize = 10000
Samplesize = 100
Max = 1 << 20
bigset = set( random.sample( xrange(Max), Setsize )) # initial subset of 0 .. Max
def calc( aset ):
return set( x + 1 for x in aset ) # << your code here
# sample, calc a new subset of bigset, add it --
for iter in range(3):
asample = random.sample( bigset, Samplesize )
newset = calc( asample ) # new subset of 0 .. Max
bigset |= newset
Podrías usar matrices numpy o bitrayen vez de set
, pero esperaría que domine el tiempo en Calc ().
¿Cuáles son sus setsize y muestras, más o menos?