Leistung von numpy.random.choice

Ich habe den Code und die Timings aktualisiert.

Ich versuche, die Leistung einer Funktion in meinem Code zu verbessern. Ich muss eine Liste mit zufälligen Elementen erzeugen. Allerdings müssen verschiedene Teile der Liste mit Elementen aus verschiedenen Sätzen gefüllt werden. Ein Beispiel für den Code ist unten. Ich muss Millionen von Listen wie die, eine zu einer Zeit zu generieren.

Funktion foo1 ist die schnellste, aber es tut nicht was ich brauche Es ist dort für Leistungsreferenz. Funktionen foo2 und foo3 tun, was ich brauche, aber verbringen fast dreimal die Bearbeitungszeit von foo1.

Python 2.7.9 (Standard, Feb 10 2015, 03:29:19). [GCC 4.2.1 Kompatibler Apple LLVM 6.0 (clang-600.0.56)] auf Darwin. Numpy Version '1.8.1'

import numpy import timeit _ops_1 = ["-123.456", "3.1416", "1", "2"] _ops_2 = ["ABC", "XYZ", 'A', 'B', 'C'] size = 10 def foo1 (): return numpy.random.choice(_ops_1 + _ops_2, 5*size) def foo2 (): return list(numpy.concatenate((numpy.random.choice(_ops_1, 2*size), numpy.random.choice(_ops_1 + _ops_2, size), numpy.random.choice(_ops_2, 2*size)), 0)) def foo3 (): return numpy.random.choice(_ops_1, 2*size).tolist() + \ numpy.random.choice(_ops_1 + _ops_2, size).tolist() + \ numpy.random.choice(_ops_2, 2*size).tolist() ### Suggested by Divakar def random_choice_replace_True(arr,size): return numpy.take(arr,numpy.random.randint(0,len(arr),size)) def foo4 (): return random_choice_replace_True(_ops_1, 2*size).tolist() + \ random_choice_replace_True(_ops_1 + _ops_2, size).tolist() + \ random_choice_replace_True(_ops_2, 2*size).tolist() ### 2nd suggestion by Divakar def random_choice_replace_True_idx(arr,size): return numpy.array(arr)[numpy.random.randint(0,len(arr),size)] def foo5 (): return random_choice_replace_True_idx(_ops_1, 2*size).tolist() + \ random_choice_replace_True_idx(_ops_1 + _ops_2, size).tolist() + \ random_choice_replace_True_idx(_ops_2, 2*size).tolist() ########### setup = '''import numpy _ops_1 = ["-123.456", "3.1416", "1", "2"] _ops_2 = ["ABC", "XYZ", 'A', 'B', 'C'] size = 10''' # As required, Number was increased to 10 million to get closer to actual timings timeit.timeit(foo1, setup=setup, number=10000000) timeit.timeit(foo2, setup=setup, number=10000000) timeit.timeit(foo3, setup=setup, number=10000000) timeit.timeit(foo4, setup=setup, number=10000000) timeit.timeit(foo5, setup=setup, number=10000000) 

Die Laufzeiten auf meiner Maschine waren:

Timeit.timeit (foo1, setup = setup, number = 10000000) 235.22050380706787

Timeit.timeit (foo2, setup = setup, number = 10000000) 760.1884841918945

Timeit.timeit (foo3, setup = setup, number = 10000000) 560.77258586883545

Timeit.timeit (foo4, setup = setup, number = 10000000) 388.69550228118896

Timeit.timeit (foo5, setup = setup, number = 10000000) 252.32089233398438

Nun, für jetzt nehme ich den 2. Vorschlag von Divakar, was ziemlich gut ist. Aber andere Vorschläge sind willkommen!

One Solution collect form web for “Leistung von numpy.random.choice”

Dass np.random.choice mit seinem optionalen Argument replace wird gesetzt als True gibt zufällig ausgewählte Elemente aus dem Eingabe-Array zurück und die Elemente können wiederholt werden. Wir können ein solches Verhalten simulieren, indem wir zufällige Indizes erzeugen, die die Länge des Arrays abdecken und in das Array für die Auswahl indizieren. So können wir das mit so etwas simulieren –

 def random_choice_replace_True(A,size): return np.array(A)[np.random.randint(0,len(A),size)] 

Wenn es sich um Eingaben handelt, die bereits NumPy-Arrays sind, können Sie den np.array(A) zur Konvertierung überspringen und einfach dort A .

  • Beschleunigung der Stichprobe der Kernelschätzung
  • Numpy Version von "Exponential gewichtet gleitenden Durchschnitt", entspricht pandas.ewm (). Mean ()
  • Dataframe Darstellung eines rollenden Fensters
  • Wie optimiere ich den Speicher und die zeitliche Nutzung des folgenden Algorithmus in Python
  • Könnte auf Listen schneller sein
  • Speedup pydev Debugging auf Python 2.6+
  • Ersetzen Sie die Werte in der Liste mit Python
  • Effiziente Art der XML-Analyse in ElementTree (1.3.0) Python
  • Kreuzprodukte mit einsums
  • Implementierung Pool auf einer for-Schleife mit vielen Eingängen
  • Kann ich eine Liste von Farben für Punkte auf matplotlib's 'Axes.plot ()' übergeben?
  • Python ist die beste Programmiersprache der Welt.