perf(radio/pick): speedup radio track picking code NOCHANGELOG

environments/review-docs-renov-k6e5t2/deployments/15261
JuniorJPDJ 2022-11-08 08:53:32 +00:00 zatwierdzone przez Georg Krause
rodzic 24f0ee319e
commit 3c7d9b5ac8
2 zmienionych plików z 15 dodań i 7 usunięć

Wyświetl plik

@ -1,6 +1,7 @@
import datetime
import logging
import random
from typing import Optional, List, Tuple
from django.core.exceptions import ValidationError
from django.db import connection
@ -25,14 +26,21 @@ class SimpleRadio(object):
def clean(self, instance):
return
def pick(self, choices, previous_choices=[]):
possible_choices = [x for x in choices if x not in previous_choices]
return random.sample(possible_choices, 1)[0]
def pick(
self, choices: List[int], previous_choices: Optional[List[int]] = None
) -> int:
if previous_choices:
choices = list(set(choices).difference(set(previous_choices)))
return random.sample(choices, 1)[0]
def pick_many(self, choices, quantity):
return random.sample(list(choices), quantity)
def pick_many(self, choices: List[int], quantity: int) -> int:
return random.sample(list(set(choices)), quantity)
def weighted_pick(self, choices, previous_choices=[]):
def weighted_pick(
self,
choices: List[Tuple[int, int]],
previous_choices: Optional[List[int]] = None,
) -> int:
total = sum(weight for c, weight in choices)
r = random.uniform(0, total)
upto = 0

Wyświetl plik

@ -21,7 +21,7 @@ def test_can_pick_track_from_choices():
previous_choices = [first_pick]
for remaining_choice in choices:
pick = radio.pick(choices=choices, previous_choices=previous_choices)
assert pick in set(choices).difference(previous_choices)
assert pick in set(choices).difference(set(previous_choices))
def test_can_pick_by_weight():