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 の 1 つのコアの約 12% を使用しています。

今後はマルチプロセッシング ライブラリを試して速度を上げたいと思いますが、最初にこの問題の真相を突き止めたいと思います。

これは私のループの問題であり、パフォーマンスが低下しますか?

4

1 に答える 1

1

im.save()呼び出しは物事を遅くしています。同じディレクトリに繰り返し書き込むと、OS ディスク キャッシュがスラッシングされる可能性があります。呼び出しを削除すると、OS はディスク キャッシュを介してイメージの読み取りアクセス時間を最適化できました。

マシンに複数の CPU コアがある場合、OS が各サイズ変更操作を実行するためにそれらのコア全体で複数のサブプロセスをスケジュールするため、サイズ変更プロセスを実際に高速化できます。これらのプロセスはすべて、読み取りと書き込みの両方で同じディスクにアクセスする必要があるため、パフォーマンスが直線的に向上することはありません。

于 2013-01-21T11:41:52.350 に答える