本文详细介绍Python中生成器和迭代器的概念及两者区别。并通过一个案例分析两者在实际应用中的性能差异。 生成器 生成器是一种特殊类型的迭代器,它使用函数和yield关键字定义,可以像普通函数一样调用和执行。生成器在每次迭代时产生一个值,并在下一次迭代时恢复执行。 在使用时,生成器函数会返回一个生成器对象,这个对象可以用于在函数中挂起和恢复函数的执行状态。 这种产生和恢复执行的机制,使得它只在需要的时候生成一个值,而不是一次性生成整个序列。这样,生成器在内存使用和效率上更加优化,特别适合大型数据处理。 下面是一个简单的生成器函数的例子: def simple_generator_function():yield 1 yield 2 yield 3 在这个例子中,函数simple_generator_function包含了三个yield语句,每次调用这个函数时,它会返回一个生成器对象。这个对象包含了yield语句后面的值。 下面是如何使用这个生成器对象: for value in simple_generator_function():print(value) 运行效果 这个for循环会遍历生成器对象中包含的所有值。 迭代器 迭代器是Python中实现迭代协议的一个对象,本质上是一种Python数据结构,它实现了__next__()和__iter__()等方法。 其中,__iter__()方法返回迭代器自身,__next__()方法返回序列中的下一个值。 迭代器能够支持for循环以及next()函数的调用。在每次迭代时,迭代器都会产生一个值,直到遍历完所有值,如果没有下一个值了,就会抛出StopIteration异常。 下面是一个简单的迭代器的例子: class SimpleIterator:def __iter__(self): self.current = 0 return selfdef __next__(self): if self.current < 3: self.current += 1 return self.current else: raise StopIteration 在这个例子中,我们定义了一个简单的迭代器SimpleIterator。 这个迭代器重写了__iter__()和__next__()方法。__iter__()方法返回迭代器自身,并初始化一个计数器self.current,__next__()方法返回这个计数器的下一个值,如果计数器大于3,就会抛出StopIteration异常。 下面是如何使用这个迭代器: for value in SimpleIterator():print(value) 这个for循环会遍历迭代器SimpleIterator中包含的所有值。 运行效果 生成器和迭代器的区别 虽然生成器和迭代器都可以用于for循环的遍历,但是它们之间有明显的不同之处。 1.实现方式不同 生成器使用了yield语句来实现,而迭代器使用了类的魔法方法__iter__()和__next__()来实现。 2.生成方式不同 生成器可以逐个生成序列中的值,而迭代器一次性生成整个序列,将其存储在内存中。 3.执行方式不同 生成器像函数一样调用和执行,可以在每次迭代时产生和恢复值,而迭代器则按照序列的下一个元素依次执行。 4. 功能不同 生成器主要用于生成序列,而迭代器主要用于遍历序列。 案例:生成器与迭代器性能差异 用于比较生成器和迭代器的性能差异: import timedef simple_generator_function():for i in range(100000): yield iclass SimpleIterator: def __init__(self): self.values = list(range(100000))def __iter__(self): self.current = 0 return selfdef __next__(self): if self.current < len(self.values): self.current += 1 return self.values[self.current - 1] else: raise StopIterationstart_time = time.time()for value in SimpleIterator(): passprint("Time for iterator:", time.time() - start_time)start_time = time.time()for value in simple_generator_function(): passprint("Time for generator:", time.time() - start_time) 运行效果 在这个例子中,我们定义了一个生成器函数和一个迭代器类,它们都是用于生成一个包含100000个整数的序列,我们分别用for循环遍历它们,并测量它们的运行时间。 运行结果显示,生成器比迭代器运行速度更快,这是因为生成器只在需要时才生成值,而迭代器则需要一次性生成整个序列。 结论 生成器和迭代器都是用于处理序列的重要工具。它们在功能和实现方式上有很大的不同,而且在性能方面也有明显的差异。开发者在选择使用哪种类型时,应该根据具体的需求进行评估,并选择最适合的一种类型。
标签:__,迭代,Python,self,生成器,current,time From: https://www.cnblogs.com/liuxuelin/p/18032278