Frage

Ich muss gleichmäßig nach zufällig eine Zahl aus einem Satz mit fester Größe probieren, einige Berechnung durchführen und die neue Zahl wieder in den Satz einfügen. (Die benötigten Zahlenproben sind sehr groß)

Ich habe versucht, die Zahlen in einer Liste zu speichern und Random.choice () zu verwenden, um ein Element auszuwählen, zu entfernen und dann das neue Element anzuhängen. Aber das ist viel zu langsam!

Ich denke, die Zahlen in einem Numpy -Array zu speichern, eine Liste von Indizes zu probieren und für jeden Index die Berechnung durchzuführen.

  • Gibt es eine schnellere Möglichkeit, diesen Prozess durchzuführen?
War es hilfreich?

Lösung

Python -Listen werden intern als Arrays implementiert (wie Java ArrayListS, C ++ std::vectors usw.), also ist das Entfernen eines Elements aus der Mitte relativ langsam: Alle nachfolgenden Elemente müssen wieder integriert werden. (Sehen http://www.laurentluce.com/posts/python-list-implementation/ Weitere Informationen dazu.) Da die Reihenfolge der Elemente für Sie nicht relevant zu sein scheint, würde ich empfehlen, nur zu verwenden random.randint(0, len(L) - 1) einen Index auswählen i, dann benutze L[i] = calculation(L[i]) So aktualisieren Sie die iTH Element.

Andere Tipps

Ich muss gleichmäßig nach zufällig eine Zahl aus einem Satz mit fester Größe probieren, einige Berechnung durchführen und die neue Zahl wieder in den Satz einfügen.

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

zufällig.Sample (ein Satz oder eine Liste oder ein Numpy -Array, nSample) ist sehr schnell, aber es ist mir nicht klar, wenn Sie so etwas wollen:

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

Sie könnten Numpy Arrays verwenden oder BitarrayAnstatt von set, aber ich würde erwarten, dass die Zeit in Calc () dominiert.

Was sind Ihr SetSize und Ihr Probe, grob?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top