观智能其它文章推荐:快来尝鲜!阿里开源3D人体重建模型,单张图片指定动作生成视频
生成器
1 生成器函数**(Generator function)**
-
详解:
生成器可以使用函数来创建,生成器函数使用yield关键字来产生值,而不是使用return。生成器可以被iter()、next()和for循环调用。在迭代时,生成器函数会从上一次的yield语句处恢复执行(Python保存了上下文),直到遇到下一个yield语句或函数结束。****
所以说生成器是一种特殊的迭代器,更高级的迭代器,__iter__和__next__魔法函数由Python自动实现,不需要我们显式定义。 -
案例
做视频推理时使用生成器,即一次返回一帧的推理结果,而不是将所有帧的结果放在列表中一次性返回;
做大语言模型推理时使用生成器,流式输出,而不是等待所有token生成后一次性返回。
-
语法: 使用
yield
关键字定义生成器函数。 -
优点: 可以看出,生成器的一个重要特性是懒惰计算,即它只在需要时才生成值。这意味着生成器不会一次性计算所有值并存储在内存中,从而节省了大量内存。
-
示例:
def fibonacci_generator():a, b = 0, 1while True:yield aa, b = b, a + bdef square_generator(iterable):for value in iterable:yield value * value#既然说在迭代中每次执行到下一个yield语句,那么可以定义一个最简单形式的生成器 def simple_generator():yield 100yield 200yield 300if __name__ == '__main__':fib = fibonacci_generator()for _ in range(10):print(next(fib),end=" ") # 输出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34print() # 换行for i in square_generator([1,2,3,4,5]):print(i,end=" ") #输出1 4 9 16 25print()#换行for i in simple_generator():print(i, end=" ") # 输出100 200 300
2 生成器表达式与列表推导式
生成器表达式是构建生成器的另一种方式,类似于列表推导式,但使用圆括号 ()
而不是方括号 []
。
示例:
#通过生成器表达式构建生成器
gen = (x * x for x in range(5))#普通的列表推导式
l = [x*x for x in range(5)]