【发布时间】:2021-03-22 03:15:05
【问题描述】:
我有一系列生成器,它们产生需要合理内存量的对象(它们是 ipaddress.IPv4Network 实例,从它们产生一个完整的 ipaddress.IPv4Address 实例)。
gens = [a, b, c, ...]
每个生成器都有确定数量的元素将产生,例如:
gen_lens = [17000000, 1024, 8192, ...]
我想以随机顺序获取长度为n 的成批生成值。任何生成器中的每个项目只能选择一次。
我目前的想法是获取可以产生的可能元素的总数(等于最大数组索引 - 1),然后使用类似 Fisher-Yates-Knuth 算法的方法以随机顺序遍历此列表,产生给定随机索引的项目:
random_indexes = random.shuffle(range(0, sum(gen_lens)))
for i in random_indexes:
# some windowing logic here to check which generator we should get from and set index appropriately, x = generator index, y = i - sum(gen_lens[0:x])
yield gens[x][y]
所以最终结果是,我有一个新的生成器,它将从我的输入生成器中产生所有元素的随机排列,而不必存储我的子生成器所产生的结果 all .
它仍然需要构建一个索引列表,当您拥有数百万个索引时,这是相当昂贵的。有办法解决吗?任何人都可以提出更好的方法吗?
【问题讨论】:
-
不确定我是否 100% 理解您的问题,但感觉
itertool.chain可能是前进的方向。您可以将可迭代对象连接在一起,而无需支付连接大型可迭代对象的正常费用。 docs.python.org/3/library/… -
@scotty3785 我认为这有助于简化使用随机索引抓取元素!但它没有解决随机排列部分。
-
OP,您的提案似乎没有考虑到以下条件:“来自任何生成器的每个项目只能选择一次。”一批。我的理解正确吗?
-
谢谢@AajKaal - 我相信是这样,因为我使用的是所有可能索引的离散列表,因此不应选择来自任何生成器的重复项。我真的应该注意到,这些生成器实际上是可下标的,这根本不是 Python 生成器的典型特征......
标签: python python-3.x random permutation