Python3 迭代器与生成器

迭代器与生成器

迭代器和生成器是Python中非常重要和有用的两种编程方式,它们不仅提供了方便的编程方式,而且具有高效、灵活等优点。本文将详细介绍Python中的迭代器和生成器,并展示它们在实际应用中的强大威力。

什么是迭代器?

在Python中,我们可以通过迭代器的方式来遍历一个序列中的元素。迭代器是一种可以遍历集合的对象,它可以在循环语句中被使用。可以根据需求,创建自己的迭代器。在Python中,迭代器是一个实现了迭代器协议的对象,即实现了__iter__和__next__方法。

__iter__方法返回一个迭代器对象,__next__方法返回集合中的下一个元素。

# 定义一个迭代器

class MyIterator:

def __iter__(self):

self.a=0

return self

def __next__(self):

if self.a<10:

x = self.a

self.a +=1

return x

else:

raise StopIteration

上面的代码定义了一个MyIterator迭代器,该迭代器可以在循环语句中使用,例如:

myit= MyIterator()

for i in myit:

print(i) # 输出0~9

什么是生成器?

生成器是一种特殊的迭代器,可以通过函数来创建。它们是在Python2.5中引入的,通过生成器可以更加方便高效地生成数据。

生成器的优点还在于:不需要像列表一样一次性生成所有数据,而是可以通过yield关键字在需要时才生成相应的数据。

# 通过函数来创建生成器

def mygenerator():

yield 1

yield 2

yield 3

yield 4

yield 5

for i in mygenerator():

print(i) #输出1~5

使用生成器的一个重要应用就是在处理大数据集合时,减少了多余的内存使用,从而提高了执行效率。另外,生成器的实现方式也可被视为一种优秀的设计思想--惰性计算。

如何优化生成器的执行效率?

当我们需要生成的数据量非常大时,生成器可能会出现效率方面的问题。这时可以通过以下两种方式进行优化:

使用推导式

Python支持列表推导式和生成器推导式,可以通过它们优化代码的效率。

下面是使用列表推导来优化生成器的例子:

gen1 = (x*x for x in range(10000))

list1 = [x*x for x in range(10000)]

我们使用时钟,统计出这两种方式的执行时间:

import time

def test():

# 使用生成器推导式

start1 = time.clock()

gen1 = (x*x for x in range(10000))

for i in gen1:

pass

end1 = time.clock()

# 使用列表推导式

start2 = time.clock()

list1 = [x*x for x in range(10000)]

for i in list1:

pass

end2 = time.clock()

return end1-start1, end2-start2

time1, time2 = test()

print(f"generators: {time1}, list compression: {time2}")

根据实验结果,使用列表推导式的效率要高于生成器推导式。

使用缓存

在大数据处理时,生成器的效率会受到程序的缓存机制大小的限制,可以通过增加可访问的缓存来提高它的性能。

下面是使用窗口缓存来优化生成器的例子:

def window_filter(data, window_size, threshold):

window_value = []

# 构建窗口

for i in range(0, window_size):

window_value.append(data.__next__())

# 判断

while True:

s = sum(window_value)

if s >= threshold:

yield True

else:

yield False

try:

window_value = window_value[1:]

window_value.append(data.__next__())

except StopIteration:

break

上面的代码将一组数据拆分成一个长度为window_size的窗口,每次向窗口添加一组数据,并根据阈值判断窗口中数据的状态。

通过这种方式可以减少对数据的访问次数,提高了程序的处理效率。

结论

迭代器和生成器是Python中非常有用的两种编程方式。它们可以极大地提高程序的执行效率并减少了内存的使用。在大数据处理时,我们可以通过推导式和缓存机制来优化它们的性能。

后端开发标签