【问题标题】:Copying a PIL image as quickly as I can open it尽可能快地复制 PIL 图像打开它
【发布时间】:2015-08-04 01:39:30
【问题描述】:

我发现在 PIL 中,我从磁盘加载图像的速度比复制它的速度要快得多。有没有比调用 image.copy() 更快的方法来复制图像? (这怎么可能?)

示例代码:

import os, PIL.Image, timeit

test_filepath = os.path.expanduser("~/Test images/C.jpg")
load_image_cmd = "PIL.Image.open('{}')".format(test_filepath)

print((PIL.Image.open(test_filepath)).__class__)
print(min(timeit.repeat(load_image_cmd, setup='import PIL.Image', number=10000)))
print(min(timeit.repeat("img.copy()", setup='import PIL.Image; img = {}'.format(load_image_cmd), number=10000)))

生产:

PIL.JpegImagePlugin.JpegImageFile
0.916192054749
1.85366988182

gc.enable 添加到timeit 的设置中并没有太大的改变。

【问题讨论】:

  • 您最后的timeit 是衡量复制空字典的速度,而不是PIL.image。无论如何,最好避免prematurely optimizing 的事情。
  • @martineau:再读一遍;该字符串后面有一个.format(…)
  • @duskwuff:哎呀,你是对的,错过了。无论如何,关于优化的部分仍然有效。
  • @martineau,关于过早的优化问题,这是我从更大的东西中提取的存根代码。我反复这样做,否则我不会注意到。这是否解决了您的担忧?
  • filename 属性添加到从PIL.Image.open() 返回的图像实例是微不足道的。

标签: python performance time python-imaging-library


【解决方案1】:

根据 PIL 文档,open() 是一个惰性操作,这意味着它还没有真正完成使用图像的所有工作。

然而,要执行copy(),它几乎肯定必须阅读整个内容并进行处理。

编辑:

要测试这是否正确,您应该在 timeit 中访问每个图像中的一个像素。

编辑 2:

再看一下文档就会发现,open() 后面的 load() 应该可以让它完成所有工作。

【讨论】:

  • 是的,就是这样,谢谢!我不确定这如何解释我从程序中看到的性能异常;我得从第一格开始。
  • @kuzzooroo 任何图像的第一个副本都在有效地执行 load() —— 这将产生使 open() 似乎花费更少时间的效果使 copy() 似乎需要 更多 时间。
猜你喜欢
  • 2019-02-21
  • 2018-04-19
  • 2016-07-25
  • 2018-04-20
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多