<p>由于您没有提供示例图像,所以我制作了一个虚拟文件,其尺寸为2544x4200,大小为1.1MB,并在答案的末尾提供。我复制了1000张图片,并为每个基准处理了1000张图片。在</p>
<p>因为你只在评论区给出你的代码,所以我把它拿走,格式化,并尽我所能做到最好。我还将它放在一个循环中,这样它就可以处理许多文件,只需调用Python解释器一次——当您有20000个文件时,这一点就变得很重要了。在</p>
<p>看起来像这样:</p>
<pre><code>#!/usr/bin/env python3
import sys
from PIL import Image
# Process all input files so we only incur Python startup overhead once
for filename in sys.argv[1:]:
print(f'Processing: {filename}')
imgc = Image.open(filename).crop((0, 150, 270, 1050))
</code></pre>
<p>我的怀疑是我可以更快地使用:</p>
<ul>
<li>GNU并行,和/或</li>
<li>皮维普斯</li>
</ul>
<p>以下是您的代码的<code>pyvips</code>版本:</p>
^{pr2}$
<p>结果如下:</p>
<h2>顺序原始码</h2>
<pre><code>./orig.py bc*jpg
224 seconds, i.e. 224 ms per image, same as you
</code></pre>
<h2>并行原始代码</h2>
<pre><code>parallel ./orig.py ::: bc*jpg
55 seconds
</code></pre>
<h2>并行原始代码,但传递尽可能多的文件名</h2>
<pre><code>parallel -X ./orig.py ::: bc*jpg
42 seconds
</code></pre>
<h2>顺序pyvips</h2>
<pre><code>./vipsversion bc*
30 seconds, i.e. 7x as fast as PIL which was 224 seconds
</code></pre>
<h2>并行pyvips</h2>
<pre><code>parallel ./vipsversion ::: bc*
32 seconds
</code></pre>
<h2>并行pyvips,但传递尽可能多的文件名</h2>
<pre><code>parallel -X ./vipsversion ::: bc*
5.2 seconds, i.e. this is the way to go :-)
</code></pre>
<p><a href="https://i.stack.imgur.com/tBHRF.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/tBHRF.jpg" alt="enter image description here"/></a></p>
<hr/>
<p>请注意,您可以使用<strong>自制的<strong>在macOS上安装<strong>GNU Parallel</strong>:</p>
<pre><code>brew install parallel
</code></pre>