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?
¿Fue útil?

Solución

Las listas de Python se implementan internamente como matrices (como Java ArrayListS, C ++ std::vectorS, 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 ith 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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top