
本文将详细介绍如何将一个生成器分割成多个指定大小的子生成器,并丢弃末尾不足指定大小的剩余元素。这种方法在处理大型数据集或需要分批处理数据时非常有用,尤其是在计算元素代价高昂且不希望预先遍历整个生成器的情况下。
实现的核心思想是利用 zip 函数和迭代器的特性。 zip(*[it]*n) 表达式可以从迭代器 it 中每次读取 n 个值,并将它们打包成一个元组。当迭代器中剩余的值少于 n 个时,zip 函数会停止迭代,从而有效地丢弃了这些剩余元素。
以下是一个示例代码:
def split_generator(it, n):
"""
将生成器 it 分割成大小为 n 的子生成器,并丢弃剩余元素。
Args:
it: 要分割的生成器。
n: 每个子生成器的大小。
Yields:
包含 n 个元素的元组,表示一个子生成器。
"""
yield from zip(*[it]*n)
# 示例用法
def my_generator(limit):
for i in range(limit):
yield i
# 创建一个生成器,包含 17 个元素
my_gen = my_generator(17)
# 将生成器分割成大小为 5 的子生成器
for chunk in split_generator(my_gen, 5):
print(chunk)
# 输出:
# (0, 1, 2, 3, 4)
# (5, 6, 7, 8, 9)
# (10, 11, 12, 13, 14)代码解释:
注意事项:
总结:
通过使用 zip(*[it]*n) 方法,我们可以高效地将一个生成器分割成指定大小的子生成器,并丢弃剩余元素。这种方法避免了预先遍历生成器,从而节省了内存和计算资源。然而,需要注意的是,这种方法不可避免地需要读取一些“提前量”,并且对于非常大的 n 值,可能会增加内存占用。在选择这种方法时,需要根据具体的应用场景进行权衡。
以上就是将生成器分割成更小的生成器并丢弃多余元素的方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号