perf(radio/pick): speedup radio track picking code NOCHANGELOG
This commit is contained in:
parent
24f0ee319e
commit
3c7d9b5ac8
|
@ -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
|
||||||
|
|
|
@ -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():
|
||||||
|
|
Loading…
Reference in New Issue