亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的切分技術有哪些

發布時間:2021-11-19 15:49:13 來源:億速云 閱讀:161 作者:iii 欄目:編程語言

本篇內容介紹了“Python的切分技術有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

列表切分在

不考慮內存占用的情況下,我們對上面的大任務進行一個切分。比如我們將大任務切分成的小任務是每秒最多只訪問5個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()

關鍵代碼都在for循環里,首先我們通過聲明range的第三個參數,該參數指定迭代的步長為5,這樣每次index增加都是以5為基數,即0,5,10。。。

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

隨著url列表的增加,我們會發現內存的占用也在提高了。這個時候我們就需要對代碼進行修改了,我們知道生成器是比較節省內存的空間的,修改之后代碼變成,下面的這樣。

生成器切分

# -*- coding: utf-8 -*- # @時間 : 2019-11-23 23:47 # @作者 : 陳祥安 # @文件名 : g.py # @公眾號: Python學習開發 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()

首先,我們修改了文件讀取的方式,把原來讀列表的形式,改為了生成器的形式。這樣我們在調用該文件讀取方法的時候大大節省了內存。

然后就是對上面for循環進行改造,因為生成器的特性,這里不適合使用for進行迭代,因為每一次的迭代都會消耗生成器的元素,通過使用itertools的islice對url_gen進行切分,islice是生成器的切片,這里我們每次切分出含有5個元素的生成器,因為生成器沒有__len__方法所以,我們將其轉為列表,然后判斷列表是否為空,就可以知道迭代是否該結束了。

修改之后的代碼,不管是性能還是節省內存上都大大的提高。讀取千萬級的文件不是問題。

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

異步生成器切分

首先先來看一個簡單的異步生成器。

我們知道調用下面的代碼會得到一個生成器

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

如果在def前面加一個async,那么在調用的時候它就是個異步生成器了。

完整示例代碼如下

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())

關于async for的切分有點復雜,這里推薦使用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的切分技術有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

祁门县| 中江县| 琼结县| 亳州市| 荆州市| 浠水县| 宁都县| 乌拉特前旗| 五台县| 陆川县| 建湖县| 乐至县| 南陵县| 宁明县| 太谷县| 大渡口区| 棋牌| 北安市| 新化县| 维西| 吉木萨尔县| 鹤庆县| 历史| 涿州市| 桓仁| 二连浩特市| 宜章县| 喜德县| 石阡县| 古蔺县| 泸州市| 武定县| 南澳县| 宁晋县| 高雄市| 慈利县| 青田县| 乌什县| 修水县| 高平市| 宁都县|