如何用最快的速度讀出大小為10G的文件的行數?弄懂 python 的迭代器


1 with open('rm_keys.txt', 'r', encoding = 'utf-8') as f:
2 
3     count = 0
4 
5 for line in f:
6 
7   count += 1
8 
9   print(count)

  for line in f 將文件對象 f 視為一個可迭代的數據類型,會自動使用 IO 緩存和內存管理,這樣就不必擔心大文件了。


一、先理解可迭代對象的本質
  隨便封裝了一個可以存放多條數據的類型是不能迭代的——需要添加了__iter__方法。
  可迭代對象的本質就是提供一個這樣的中間“人”即迭代器,幫助我們對其進行迭代遍歷使用。
  可迭代對象是一個具備了__iter__方法的對象,通過__iter__方法獲取可迭代對象的迭代器。


二、跌代器好處:實時生成數據,節省內存


三、迭代器的作用:具體指定下一個數據

 

四、如何使用迭代器

  先獲取迭代器:[可迭代對象].__iter__()
  再用next()函數來獲取下一個元素

五、判斷是否是迭代器:

  from collection import Iterator
  isinstance(對象,Iterator)
  判斷的依據是有沒有__iter__()方法和__next__()方法

 

 六、for...in...循環的本質

  先得到這個可迭代對象的迭代器iter(對象)
  使用while循環不斷得遍歷下一個值next(迭代器)
  直到遍歷到已經沒有下一個值了(會報異常StopIteration)
  退出循環

 

七、舉個例子

數學中有個著名的斐波拉契數列(Fibonacci)

數列中第一個數為0,第二個數為1

其后的每一個數都可由前兩個數相加得到:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

現在我們先通過for...in...循環來遍歷迭代斐波那契數列中的前n個數:

class Fib(object):
    def __iter__(self):
        return self

    def __next__(self):
        pass

fib = Fib()

for i in fib:
    print(i)


# 一次性的到結果:0, 1, 1, 2, 3, 5, 8, 13....

 

這個斐波那契數列我們可以用迭代器來實現,

每次迭代都通過數學計算來生成下一個數。

使用迭代器的形式實現:

class Fib(object):
    def __init__(self, num):
        self.num = num   # 表示前n項
        self.a = 0     # 前一個值
        self.b = 1     # 后一個值
        self.i = 0    # 次數

    def __iter__(self):
        return self

    def __next__(self):
        if self.i < self.num:
            ret = self.a
            self.a, self.b = self.b, self.a+self.b
            self.i += 1
            return ret
        else:
            raise StopIteration

fib = Fib(10)

print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
for i in fib:
    print(i)

# 想要多少個就next()多少個

 

八、有了迭代器,接下就可以了解生成器

  生成器是一種特殊的迭代器,它比迭代器更優雅

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM