Python PIL库性能

2 投票
2 回答
2246 浏览
提问于 2025-04-16 14:29

我遇到的问题是,我有一个Python脚本,每次运行时会处理大约几千张图片,但它并没有占用太多的内存和CPU。

我该如何提高性能,避免输入输出的开销呢?

这个脚本每次执行时会生成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,我想你可以帮我改善我的代码。

非常感谢!

附注:抱歉我的英语不太好。

2 个回答

0

大部分时间都花在了urlopen()上,不过我觉得im.save可以改进一下。

这是因为urlopen(或者说read)这部分是在网络上进行输入输出操作,这个过程会比较慢,主要取决于你网络的带宽和服务器的情况。

所以,如果你想通过网络下载5000张图片,其实很难加快这个速度。

2

你可以通过同时运行多个线程来利用一些输入输出的并发性。这可能有两个好处:

  • 更多的TCP连接意味着速度更快(不过,有时候做个好网民也很重要)。
  • 你现在的程序是先把远程网址的数据读到内存里,然后处理这些数据,最后再保存到硬盘。这样做的话,CPU没有被充分利用,因为有一部分时间你是在等数据接收。在这段时间里,你并没有在处理数据。

在这种情况下,GIL(全局解释器锁)不是问题,因为在进行输入输出操作时,它会被释放。

如果你想防止文件立即写入硬盘,一个方法是关闭正在写入设备上的fsync功能(如果它现在是开启的)。

撰写回答