如果您多次调用此函数,并且两个函数都没有太多的范围需要设置,并且都愿意拥有查找表所需的前期成本和内存,那么您可以对其进行预处理:
from itertools import chain
level_sets = [(range(1,10), 12),
(range(12,16), 18),
(range(18,29), 34),
(range(34,46), 54),
(range(54,63), 73),
(range(73,85), 85),
(range(10,12), 16),
(range(16,18), 29),
(range(29,34), 46),
(range(46,54), 63),
(range(63,73), 85)]
levels = {l: s for l, s in chain(*([(k, v) for k in r] for r, v in level_sets))}
...
for buy in recommendation_list:
level = levels.get(level_buy)
这基本上是说,对于每个整数,它都会指向某个级别。这样做的好处是,每次你需要获得一个级别购买的级别时,它都是一个O(1)操作——因此,如果你有大量的建议要提出,它将有一点前期成本(构建查找表),然后是非常小的增量成本(查找级别购买)。这与无预付成本和每次O(n)成本形成对比
n
是您拥有的范围数。