Also im Grunde habe ich eine Datenbanktabelle mit Fotos. Jedes Foto hat eine Bewertung < 0,1> und Kategorien (eine oder mehrere). Ich brauche einen Weg, um effizient X-Elemente aus dieser Tabelle zu gewichten, zufällig, aber in Bezug auf Kategorien, ich muss dies in python3 + Django tun (oder Microservice durch Redis kommunizieren oder ausgesetzt RESTapi).Gewichtete Zufallsauswahl mit Kategorien
zB: Tabelle:
.---------.--------.------------.
| photo | rating | categories |
:---------+--------+------------:
| Value 1 | 0.8 | art, cats |
:---------+--------+------------:
| value 2 | 0.5 | cats |
:---------+--------+------------:
| value 3 | 0.9 | night |
'---------'--------'------------'
Und wenn ich fragen Sie nach 1 Foto mit Kategorien (Katzen, Hunde). Der Algorithmus sollte so etwas wie
zurückkehrennumpy.random.choice([Value 1, Value 2], 1, [0.8, 0.5], replace=False)
Derzeit jedes Mal, wenn ich gefragt werde, denn es mache ich etwas wie folgt:
photos = Photos.objects.filter(category__in=[list of wanted categories])
photos, weights = zip(*list(photos.values_list('photo', 'rating')))
res = numpy.random.choice(photos, amount_wanted, weights, , replace=False)
Gibt es mehr efficent Ansatz dazu? Ich kann jeden AWS-Dienst verwenden, um es zu erreichen.
Von dem, was ich herausgefunden habe. 'Order_by ('?')' Ist super langsam. 'Hinweis: order_by ('?') Abfragen können teuer und langsam sein, abhängig vom verwendeten Datenbank-Backend. ' https://docs.djangoproject.com/de/1.10/ref/models/querysets/# Order-by – Quba
Ich mag die Lösung, aber ich denke Ordnung durch "?" ist auch langsam. Sie könnten Python einen zufälligen Eintrag von der Ergebnismenge (Ganzzahl zwischen 0 und Ergebnismenge) nehmen lassen, und es wird viel schneller, denke ich. –
Ich habe die Lösung aktualisiert, um 'random.sample' anstelle von' order ('?') 'Zu verwenden. –