【Python】リスト型とNumPy型の処理速度比較

この記事では、PythonでリストとNumPy配列で画像処理した場合の処理速度を比較してみたので紹介します。

スポンサーリンク

画像処理の処理時間

Pythonで大量のデータを扱う場合、処理速度の面でNumPyなどの数値計算ライブラリを使ったほうが良いと言われています。
今回は、440×450の画像の2値化を例に、実際にリストとNumPyで実装して処理速度を比較してみました。

スポンサーリンク

ソースコード

サンプルプログラムのソースコードです。

NumPy配列

# -*- coding: utf-8 -*-
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
import time

def main():
    # 入力画像をグレースケールで読み込み
    img = ndimage.imread('input.jpg', mode='L')

    # 処理開始時間の計測
    start = time.time()

    # 2値化
    img[img<160] = 0
    img[img>=160] = 255

    # 処理終了時刻の計測
    end = time.time()

    # 処理時間(終了時刻-開始時刻)の表示
    print (end-start, "[sec]") # 0.00099945068359375 [sec]


if __name__ == "__main__":
    main()

リスト

# -*- coding: utf-8 -*-
import numpy as np
from scipy import ndimage
import time

def main():
    # 入力画像をグレースケールで読み込み
    img = ndimage.imread('input.jpg', mode='L')

    # NumPy型 → リスト型に変換
    img = img.tolist()

    # 処理開始時間の計測
    start = time.time()

    # 2値化処理
    for x in range(0, len(img[0])):
        for y in range(0, len(img)):
             if img[y][x] > 160:
                 img[y][x] = 255
             else:
                 img[y][x] = 0

    # 処理終了時刻の計測
    end = time.time()

    # 処理時間(終了時刻-開始時刻)の表示
    print (end-start, "[sec]") # 0.06704449653625488 [sec]


if __name__ == "__main__":
    main()
スポンサーリンク

実行結果

結果は以下の通りになりました。

■実行環境

項目 説明
入力画像 グレースケール画像(440×450[px])
OS Windows10 Home Premium 64bit
メモリ容量 4GB
CPU Core i3-2330M 2.20GHz
ソースコード 【Python】リスト型とNumPy型の処理速度比較

■結果

処理速度[ms]
Python+リスト 67.04449653625488
Python+NumPy 0.99945068359375

リストが約67[ms]、NumPyが約1[ms]と約67倍も処理速度が高速化されています。

おすすめ記事

PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

Python画像処理
スポンサーリンク

コメント