我需要遍历列表任意次数,yield
以随机顺序(每次遍历完整列表时的顺序不同)对列表的每个元素进行迭代。在第二次产生该元素之前,我需要产生每个元素一次,在第三次产生该元素之前,产生每个元素两次,等等。
目前,我的代码如下所示:
def random_yield(data):
random.shuffle(data)
data_index = 0
while True:
yield data[data_index]
data_index += 1
if data_index == len(data):
random.shuffle(data)
data_index = 0
有没有办法更有效地做到这一点,所以我不支付random.shuffle()
after every len(data)
yield
s的性能损失?
您可以在每次迭代中执行一次 Fisher-Yates shuffle,从而在每次迭代中平均分配成本。这并不是更有效——事实上,它可能效率更低,因为库函数可能比 Python 代码更快——但它避免了长时间的停顿。
该代码与每次只抓取一个随机元素没有太大区别。唯一的区别是您从向量的子集中获取随机元素:
from random import randrange
def random_yield(data):
index = 0
limit = len(data)
while True:
if index + 1 >= limit:
yield data[index]
index = 0
else:
# Get a random element which we haven't yet used this cycle
# (This is a single iteration of the F-Y shuffle algorithm)
j = randrange(index, limit)
rv = data[j]
yield rv
# Swap the element we just selected so its not in the next subrange
data[j] = data[index]
data[index] = rv
index += 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句