0

我编写了一个简单的函数来将图像从 1500x2000px 调整为 900x1200px。

def resizeImage(file_list):
    if file_list:
        if not os.path.exists('resized'):
            os.makedirs('resized')
        i = 0
        for files in file_list:
            i += 1
            im = Image.open(files)
            im = im.resize((900,1200),Image.ANTIALIAS)
            im.save('resized/' + files, quality=90)
        print str(i) + " files resized successfully" 
    else:
        print "No files to resize"

我使用 timeit 函数来测量运行一些示例图像需要多长时间。这是一个结果示例。

+---------------+-----------+---------------+---------------+---------------+
| Test Name     | No. files |      Min      |      Max      |    Average    |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal |     10    | 5.25000018229 | 5.31371171493 | 5.27186083393 |
+---------------+-----------+---------------+---------------+---------------+

但是如果我重复测试,时间会逐渐增加,即

+---------------+-----------+---------------+---------------+---------------+
| Test Name     | No. files |      Min      |      Max      |    Average    |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal |     10    | 5.36660298734 | 5.57177596057 | 5.45903467485 |
+---------------+-----------+---------------+---------------+---------------+

+---------------+-----------+---------------+---------------+---------------+
| Test Name     | No. files |      Min      |      Max      |    Average    |
+---------------+-----------+---------------+---------------+---------------+
| Resize normal |     10    | 5.58739076382 | 5.76515489024 | 5.70014196601 |
+---------------+-----------+---------------+---------------+---------------+

+---------------+-----------+---------------+---------------+-------------+
| Test Name     | No. files |      Min      |      Max      |   Average   |
+---------------+-----------+---------------+---------------+-------------+
| Resize normal |     10    | 5.77366483042 | 6.00337707034 | 5.891541538 |
+---------------+-----------+---------------+---------------+-------------+

+---------------+-----------+---------------+--------------+---------------+
| Test Name     | No. files |      Min      |     Max      |    Average    |
+---------------+-----------+---------------+--------------+---------------+
| Resize normal |     10    | 5.91993466793 | 6.1294756299 | 6.03516199948 |
+---------------+-----------+---------------+--------------+---------------+

这就是我运行测试的方式。

def resizeTest(repeats):
    os.chdir('C:/Users/dominic/Desktop/resize-test')
    files = glob.glob('*.jpg')

    t = timeit.Timer(
        "resizeImage(filess)", 
        setup="from imageToolkit import resizeImage; import glob; filess = glob.glob('*.jpg')"
    )   
    time = t.repeat(repeats, 1)

    results = {
        'name': 'Resize normal',
        'files': len(files),
        'min': min(time),
        'max': max(time),
        'average': averageTime(time)
    }
    resultsTable(results)

我已将处理过的图像从我的机械硬盘驱动器移动到 SSD,但问题仍然存在。我还检查了正在使用的内存,它在所有运行过程中都保持相当稳定,最高约为 26Mb,该进程使用了​​ CPU 一个内核的 12% 左右。

展望未来,我喜欢尝试使用多处理库来提高速度,但我想先深入了解这个问题。

这会是我的循环导致性能下降的问题吗?

4

1 回答 1

1

这个im.save()电话正在减慢速度;重复写入同一目录可能会破坏操作系统磁盘缓存。当您删除调用时,操作系统能够通过磁盘缓存优化图像读取访问时间。

如果你的机器有多个 CPU 核心,你确实可以加快调整大小的过程,因为操作系统会在这些核心上安排多个子进程来运行每个调整大小的操作。您不会获得线性的性能改进,因为所有这些进程仍然必须访问同一个磁盘进行读取和写入。

于 2013-01-21T11:41:52.350 回答