迭代器怎么就节省内存了?

    科技2023-11-20  97

    迭代器怎么节省内存了?

    只知道使用迭代器能节省内存,但却不知道怎么使用才能节省内存。

    下面就来回答这个问题。

    首先创建一个list:

    In [1]: a=[1,3,5,9,10]

    其次,列表内每个元素+1,创建一个新列表

    In [2]: a1 = [i+1 for i in a]  

    依次打印a1中每个元素:

    In [8]: for i in a1:     ...:     print(i) 

    上面操作等价于:

    a1 = [] for i in a:   a1.append(i+1) for i in a1:   print(i)

    空间复杂度为 O(n),n为列表a内元素个数。

    但是,使用迭代器实现上面的元素+1并打印的空间复杂度是多少呢?

    ait = (i+1 for i in a) # 得到生成器,也是一种特殊的迭代器 for i in ait:   print(i)

    上面操作等价于:

    for i in a:   print(i+1)

    不需要额外空间,所以使用迭代器加1并打印的空间复杂度为O(1).

    结论:迭代器更加节省空间。

    自定义迭代器案例

    迭代器对象必须要实现两个方法__iter__和__next__,为了帮助大家理解,我们通过自定义一个迭代器加深对它的理解。

    自定义一个迭代器,实现斐波那契数列:

    #斐波那契数列 class Fabs():     def __init__(self,max):         self.max=max         self.n,self.a,self.b=0,0,1          #定义__iter__方法     def __iter__(self):         return self              #定义__next__方法     def __next__(self):         if self.n<self.max:             tmp=self.b             self.a,self.b=self.b,self.a+self.b             self.n+=1             return tmp         raise StopIteration

    使用这个迭代器,打印斐波那契数列前10项:

    In [13]: for item in Fabs(10):      ...:     print(item,end=' ')                                                                     1 1 2 3 5 8 13 21 34 55 
    Processed: 0.012, SQL: 8