千家信息网

Python的切分技术有哪些

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"Python的切分技术有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!列表切分在
千家信息网最后更新 2026年11月03日Python的切分技术有哪些

本篇内容介绍了"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的切分技术有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

生成器 生成 代码 内存 时候 元素 文件 迭代 任务 问题 面的 utf-8 技术 内容 参数 就是 形式 情况 方法 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 互联网通讯科技 广州互联网科技公司 狮子座互联网科技有限公司 上海致骋互联网科技 湖北码尼互联网科技有限公司电话 互联网科技商业 燊美集互联网科技有限公司 河南住房之家互联网科技 四川慕妮娅互联网科技有限公司 南博望互联网科技有限公司 梅州GM互联网络科技有限公司 黑云互联网科技有限公司 云南省自由互联网科技有限公司 富国互联网科技002692 陕西九四连强互联网科技有限公司 杭州科技互联网公司有哪些 河南商务圈互联网科技有限公司 互联网科技创业有什么好项目 株洲百竞科技的互联网营销顾问 为想互联网科技怎么样 科技股互联网 狮子座互联网科技 远信互联网科技 上海万想互联网科技 狮子座互联网科技培训 互联网在线教育科技创业 2021世界互联网领先科技成果发布 山东大美朱楼互联网科技有限公司 唐山双旺合互联网科技产业园
0