Python PIL库的性能

时间:2011-03-26 19:51:46

标签: python performance memory python-imaging-library

我遇到的问题是我有一个Python脚本,每次执行它时都会对大约数千个图像进行编码,并且它不会占用大部分内存和CPU。

如何改善性能以避免I / O开销?

该脚本每次执行时都会生成5000个缩略图,我想知道是否可以将图像存储在内存中,然后将它们“刷新”到硬盘上以提高性能。

你有什么建议来提高我的剧本的性能吗?

循环内的代码片段:

im = Image.open(StringIO.StringIO(urllib.urlopen(imagen_url).read()))
im.thumbnail((100, 50), Image.ANTIALIAS)

if im.mode != "RGB":
    im = im.convert("RGB")

im.save(dir + (imagen % coche_id), "JPEG")

大部分时间花在了urlopen()上,但我认为im.save可以改进。

我仍然从Python开始,我认为你可以帮助我改进我的代码。

非常感谢!

pd:对不起,如果我的英语不是应该的那么好。

2 个答案:

答案 0 :(得分:2)

您可以通过并发运行多个线程来利用一些i / o并发性。这可能有两个方面的帮助:

  • 更多TCP连接==更快(虽然有时也是一个很好的互联网公民)。
  • 您当前拥有的程序首先将远程URL读入内存,然后对其进行处理,然后保存到磁盘。由于某些时候您正在等待接收数据,因此未充分利用CPU。在此期间,您没有进行处理。

在这种情况下,GIL不是问题,因为它在i / o操作期间被释放。

如果你想阻止文件立即写入磁盘,一种方法可能是关闭当前正在写入的设备上的fsync。

答案 1 :(得分:0)

  

大部分时间花在了urlopen()上,但我认为im.save可以改进。

这是因为urlopen(或更确切地说是read)位通过网络执行IO,这将会很慢,具体取决于可用的带宽和服务器。

所以,如果你想通过网络下载5000张图片,你可以做很多事情来加快速度。

相关问题