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

This commit is contained in:
JuniorJPDJ 2022-11-08 08:53:32 +00:00 committed by Georg Krause
parent 24f0ee319e
commit 3c7d9b5ac8
2 changed files with 15 additions and 7 deletions

View File

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

View File

@ -21,7 +21,7 @@ def test_can_pick_track_from_choices():
previous_choices = [first_pick] previous_choices = [first_pick]
for remaining_choice in choices: for remaining_choice in choices:
pick = radio.pick(choices=choices, previous_choices=previous_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(): def test_can_pick_by_weight():