成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python的切分技術(shù)有哪些

本篇內(nèi)容介紹了“Python的切分技術(shù)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站一直通過網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、移動(dòng)互聯(lián)產(chǎn)品、營(yíng)銷型網(wǎng)站建設(shè)服務(wù)為核心業(yè)務(wù)。十年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

列表切分在

不考慮內(nèi)存占用的情況下,我們對(duì)上面的大任務(wù)進(jìn)行一個(gè)切分。比如我們將大任務(wù)切分成的小任務(wù)是每秒最多只訪問5個(gè)URL。

import os import time  CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))  def read_file():     file_path = os.path.join(CURRENT_DIR, "url_list.txt")     with open(file_path, "r", encoding="utf-8") as fs:         result = [i.strip() for i in fs.readlines()]     return result  def fetch(url):     print(url)  def run():     max_count = 5     url_list = read_file()     for index in range(0, len(url_list), max_count):         start = time.time()         fetch(url_list[index:index + max_count])         end = time.time() - start         if end < 1:             time.sleep(1 - end)   if __name__ == '__main__':     run()

關(guān)鍵代碼都在for循環(huán)里,首先我們通過聲明range的第三個(gè)參數(shù),該參數(shù)指定迭代的步長(zhǎng)為5,這樣每次index增加都是以5為基數(shù),即0,5,10。。。

然后我們對(duì)url_list做切片,每次取其五個(gè)元素,這五個(gè)元素會(huì)隨著index的增加不斷的在改變,如果最后不夠五個(gè)了,按照切片的特性這個(gè)時(shí)候就會(huì)有多少取多少了,不會(huì)造成索引超下標(biāo)的問題。

隨著url列表的增加,我們會(huì)發(fā)現(xiàn)內(nèi)存的占用也在提高了。這個(gè)時(shí)候我們就需要對(duì)代碼進(jìn)行修改了,我們知道生成器是比較節(jié)省內(nèi)存的空間的,修改之后代碼變成,下面的這樣。

生成器切分

# -*- coding: utf-8 -*- # @時(shí)間 : 2019-11-23 23:47 # @作者 : 陳祥安 # @文件名 : g.py # @公眾號(hào): Python學(xué)習(xí)開發(fā) import os import time from itertools import islice  CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))   def read_file():     file_path = os.path.join(CURRENT_DIR, "url_list.txt")     with open(file_path, "r", encoding="utf-8") as fs:         for i in fs:             yield i.strip()   def fetch(url):     print(url)   def run():     max_count = 5     url_gen = read_file()     while True:         url_list = list(islice(url_gen, 0, max_count))         if not url_list:             break         start = time.time()         fetch(url_list)         end = time.time() - start         if end < 1:             time.sleep(1 - end)   if __name__ == '__main__':     run()

首先,我們修改了文件讀取的方式,把原來讀列表的形式,改為了生成器的形式。這樣我們?cè)谡{(diào)用該文件讀取方法的時(shí)候大大節(jié)省了內(nèi)存。

然后就是對(duì)上面for循環(huán)進(jìn)行改造,因?yàn)樯善鞯奶匦?,這里不適合使用for進(jìn)行迭代,因?yàn)槊恳淮蔚牡紩?huì)消耗生成器的元素,通過使用itertools的islice對(duì)url_gen進(jìn)行切分,islice是生成器的切片,這里我們每次切分出含有5個(gè)元素的生成器,因?yàn)樯善鳑]有__len__方法所以,我們將其轉(zhuǎn)為列表,然后判斷列表是否為空,就可以知道迭代是否該結(jié)束了。

修改之后的代碼,不管是性能還是節(jié)省內(nèi)存上都大大的提高。讀取千萬級(jí)的文件不是問題。

除此之外,在使用異步爬蟲的時(shí)候,也許會(huì)用到異步生成器切片。下面就和大家討論,異步生成器切分的問題

異步生成器切分

首先先來看一個(gè)簡(jiǎn)單的異步生成器。

我們知道調(diào)用下面的代碼會(huì)得到一個(gè)生成器

def foo():     for i in range(20):         yield i

如果在def前面加一個(gè)async,那么在調(diào)用的時(shí)候它就是個(gè)異步生成器了。

完整示例代碼如下

import asyncio async def foo():     for i in range(20):         yield i   async def run():     async_gen = foo()     async for i in async_gen:         print(i)   if __name__ == '__main__':     asyncio.run(run())

關(guān)于async for的切分有點(diǎn)復(fù)雜,這里推薦使用aiostream模塊,使用之后代碼改為下面這樣

import asyncio from aiostream import stream  async def foo():     for i in range(22):         yield i   async def run():     index = 0     limit = 5      while True:         xs = stream.iterate(foo())         ys = xs[index:index + limit]         t = await stream.list(ys)         if not t:             break         print(t)         index += limit   if __name__ == '__main__':     asyncio.run(run())

“Python的切分技術(shù)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

名稱欄目:Python的切分技術(shù)有哪些
標(biāo)題網(wǎng)址:http://jinyejixie.com/article20/pdceco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序外貿(mào)網(wǎng)站建設(shè)、ChatGPT網(wǎng)頁(yè)設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
勐海县| 怀来县| 龙川县| 周宁县| 延川县| 沙坪坝区| 佛教| 台南县| 同仁县| 周宁县| 高阳县| 东乡族自治县| 神农架林区| 神农架林区| 于都县| 亳州市| 鲜城| 鹿邑县| 津南区| 星子县| 丘北县| 翁牛特旗| 墨玉县| 徐汇区| 浦城县| 丽江市| 子洲县| 景宁| 天祝| 苏尼特右旗| 高青县| 黄梅县| 全南县| 天台县| 屯留县| 大丰市| 承德市| 马尔康县| 井研县| 盐边县| 江山市|