Python映像库循环性能随着重复而变慢

2024-04-18 18:55:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个简单的函数来调整图像大小,从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函数来测量运行一些示例图像所需的时间。下面是一个结果的例子。在

^{pr2}$

但是如果我重复这个测试,时间会逐渐增加,也就是说

+---------------+-----------+---------------+---------------+---------------+
| 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%左右。在

接下来,我想用多处理库来提高速度,但我想先了解一下这个问题的本质。在

这是不是我的循环有问题导致性能下降?在


Tags: nonametest图像timefilesminmax
1条回答
网友
1楼 · 发布于 2024-04-18 18:55:21

im.save()调用正在减慢速度;重复写入同一目录可能会使操作系统磁盘缓存发生混乱。当您取消调用时,操作系统能够通过磁盘缓存优化映像的读取访问时间。在

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

相关问题 更多 >