看了一天的驗證碼處理的問題,發現現在的驗證碼實在是太復雜了,我給跪了!主要之前從來沒做過圖片處理的問題,就是有也是公司直接接別人家的接口,我甚至只需要傳到我們自己的服務器,我們后臺跟它們去對接。
想了一下,既然驗證碼暫時應該研究不到,不如跳回之前寫的爬取圖片的爬蟲身上繼續研究吧,這次不上代碼了,因為我沒寫??
主要是想加快運行速度
畢竟有很多圖片等著程序去處理,而程序的運行速度并不盡人意,而且今后如果深入研究的話,肯定會做大型的數據處理,所以我就跑去查python的多線程了- -
協程
查了一下發現并沒有多線程啊,應該是協程(摘自維基百科)
<a><blockquote>與子例程一樣,協程也是一種程序組件。相對子例程而言,協程更為一般和靈活,但在實踐中使用沒有子例程那樣廣泛。協程源自Simula和Modula-2語言,但也有其他語言支持。協程更適合于用來實現彼此熟悉的程序組件,如合作式多任務,迭代器,無限列表和管道。</blockquote></a>
生成器
其實上面協程的定義不看也無所謂了,因為python里面的協程可以說就是生成器。
生成器是什么東西呢?
首先,咱們說一下迭代器和可迭代對象
什么是可迭代對象?很好理解,可以被迭代的對象就是可迭代對象。
在程序里面的判斷就是能用for迭代的:
<blockquote>有些同學可能還不理解迭代和遍歷的區別,我在這稍微解釋以下,迭代就是把一個<b>線性結構</b>的每一個數據元素找出來,線性結構就是一個有序數據元素的集合。非線性結構:不是在一個線性數列中,每個元素與其他0或多個數據元素有聯系。而遍歷就是把非線性結構的元素一個個找出來。</blockquote>
而迭代器就是有next()方法的,既然有next()方法了,我認為其實就是一個生成器了。
生成器還有一個標志:yield。
如果一個普通的函數不用return,而是用了yield,那說明這個函數就是一個生成器了。
那生成器是干啥的呢?加快運行速度。
舉個例子來說,過年了,你媽媽在包水餃(也不知道你爸爸干啥去了),你在等著給媽媽下水餃,然后正常的流程是這樣的:
包水餃--->等著包完--->包了一大盆--->下水餃---->開始吃。
如果你媽媽一直在包水餃怎么辦?比如她想囤糧食(想瞎了我的心了),家里的盆放不開了啊,而且包太多的話,鍋也煮不開啊,怎么辦?
咱們把你媽媽包水餃的過程視作一個函數,然后每包完一個水餃,后面加一個:
<code>yield 你媽媽包的水餃</code>
這時候流程就變樣子了:你媽媽每包一個水餃,她就讓你去下水餃
這樣,根本都用不到盆!!!!!從今往后家里省下了買盆的錢,然后用這個錢買了彩票,然后中獎了,然后你就走向了人生巔峰~
也就是說,每當我需要用到當前需要的數據時,我才會讓生成器生成一條數據,不用的話就讓生成器掛在那,他也不會重新運行,再用到的時候接著上次的繼續運行,這樣對內存和運行速度進行了非常大的優化。
最后掛一句話,是看的國外作者被翻譯過來的: