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 .

  • So reduzieren Sie die Zeit, um eine Pickle-Datei in Python zu laden
  • Schnellste Weg, um das erste Objekt aus einem Quaryset in Django zu bekommen?
  • Ersetzen Sie numpy Matrixelemente durch Submatrizen
  • Mit pyglet in python, warum ist meine Bildrate beschleunigen, wenn ich Maus ziehen?
  • Gibt es einen aktuellen schnellen YAML-Parser mit Pythonbindungen?
  • Warum ist 2 ** 100 so viel schneller als math.pow (2.100)?
  • Massenstring in Python ersetzen?
  • Hdf5 und ndarray append / time-effizienter Ansatz für große Datensätze
  • Überrascht über gute Rekursionsleistung in Python
  • Python langsam Leseleistung Problem
  • Textverarbeitung - python vs perl performance
  • Python ist die beste Programmiersprache der Welt.