You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何字节对象存文件比存入numpy数组更快?后续操作怎么选?

图像字节处理的性能与使用场景问题

场景描述

我有一个代表PNG图片的字节对象:

content = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x00\x00\x00\x02\x00\x08\x03\x00\x00\x00\xc3\xa6$\xc8\x00\x00\x00\tpHYs\x00\x00\x00\x1c\x00\x00\x00\x1c\x00\x0f\x01\xb9\x8f\x00\x00\x00\x03PLTE\x00\x00\x00\xa7z=\xda\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x01\x16IDATx\xda\xed\xfd\xc1\x00\x00\x00\x00\x03!\x9c?\xf5\xbe\x83(\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0c\x02<\x00\x017\x93\x98\x01\x00\x00\x00\x00IEND\xaeB`\x82'

我尝试了两种处理方式:

  • 保存到文件:
    file = open('img.png', 'wb')
    file.write(content)
    file.close()
    
    单张耗时约0.0001秒
  • 转换为NumPy数组存入列表:
    img = np.array(Image.open(io.BytesIO(content)))
    arr.append(img)
    
    单张耗时约0.0008秒

处理400+张图片时,两者的耗时差异可达20-30秒,我有两个问题:

  1. 这种性能差异是否符合预期?
  2. 若后续要对这些文件/图像进行操作,使用数组方式是否有优势?(操作数组会不会更快?)

问题解答

1. 性能差异是否符合预期?

完全符合。两种操作的复杂度不在一个层面:

  • 直接写入文件只是把现成的二进制字节流丢给操作系统存储,几乎没有额外计算,属于轻量级IO操作,速度自然极快。
  • 转换为NumPy数组则要经过多步重量级处理:
    • 用io.BytesIO将字节对象模拟成可读取的文件流
    • PIL/Pillow解析PNG的压缩编码,解码成像素矩阵
    • 把PIL图像对象转换为NumPy数组,涉及内存分配、数据格式对齐等操作
      这些步骤每一步都有计算开销,耗时是直接写文件的数倍完全正常。

2. 数组方式后续操作有优势吗?

绝对有优势,而且优势非常显著:

  • NumPy数组是内存中连续的数值型数据结构,所有操作都基于底层优化过的C语言实现,比如滤波、裁剪、像素值运算、批量处理等,速度比反复从文件读取再解析快几个量级。
  • 如果后续要做机器学习、计算机视觉相关操作(比如用OpenCV、TensorFlow/PyTorch),这些框架原生支持NumPy数组,不需要额外格式转换,能节省大量时间。
  • 要是只是单纯存储图片不需要后续操作,直接存文件更省内存;但只要涉及任何图像运算,提前转成NumPy数组绝对划算——前期的解析耗时会被后续操作的效率提升完全覆盖。

内容的提问来源于stack exchange,提问作者Jamess11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:57:11