Python 下载网络图片并写入磁盘的提速方法及最优实现
网络图片写入磁盘提速方案
你自测的「写入磁盘耗时5秒」存在统计误差:online_image.read()才是真正拉取图片完整二进制内容的步骤,你把这个步骤和写入绑定执行,相当于下载图片内容和写入磁盘完全串行,所以看起来写入耗时很高。你需要的「加载网络图片同时同步写入磁盘」完全可以实现,优化方案如下:
方案1:修改现有mechanize代码为流式读写
mechanize返回的网络响应本身是类文件对象,不用一次性读取全部内容,按固定块大小边读边写即可,直接减少一半左右的总耗时:
import mechanize BUFFER_SIZE = 1024 * 1024 # 1M缓存块,可根据实际情况调整 br = mechanize.Browser() br.set_handle_robots(False) request = get_request('link.to.image') online_image = br.open(request) with open(image_name, 'wb') as f: # 循环读块、写块,边下载边写入 while chunk := online_image.read(BUFFER_SIZE): f.write(chunk)
方案2:更换更轻量的HTTP库降低额外开销
mechanize是为模拟浏览器交互设计的重型库,单纯下载图片会有很多无用开销,换成requests这类轻量HTTP库性能会更高,同样支持流式读写:
import requests BUFFER_SIZE = 1024 * 1024 resp = requests.get('link.to.image', stream=True) resp.raise_for_status() # 检查请求错误 with open(image_name, 'wb') as f: for chunk in resp.iter_content(chunk_size=BUFFER_SIZE): if chunk: # 过滤掉保持连接的空块 f.write(chunk)
额外优化建议
- 如果需要同时下载多张图片,可以用多线程/协程并发下载,进一步提升整体效率
- 可以调整缓存块大小:如果存储设备是SSD可以适当调大缓存块,机械硬盘可以根据4K对齐规则调整块大小提升写入效率
内容的提问来源于stack exchange,提问作者オパラ
相关产品推荐
相关产品推荐

