Python | CSV読み込み高速化(csv/NumPy/pandas/VBA速度比較)

Python

CSV読み込みで使いたくなるPython 標準モジュールのcsv、NumPy、pandas、ExcelのVBAでCSV読み込み速度を比較する。

結論

pandasが最速。標準モジュールのcsvは2倍遅い。NumPyとVBAは20倍遅い。

実験方法

  • Python標準モジュールのcsvでCSVファイルを読み込んで変数に代入することを10回繰り返したときの時間を測定する。これを5測定行う。
  • NumPyも同様。
  • pandasも同様。
  • VBAでCSVファイルを読み込んでエクセルに代入することを10回繰り返したときの時間を測定する。これを5測定行う。

読み込み対象のCSVファイル

  • 0,1,2,3,4,5,6,7,8,9というデータが20万行
  • ファイルサイズ 4.0MB

エクセルで開くとこうなる。

実験用コード

標準モジュールのcsv

#!/usr/bin/python

from time import time
import csv


file_name = r"C:\Users\yoshihiko\Desktop\yoshihiko.csv"
iteration = 10


def load_csv_BY_csv_reader(file):
    result = []
    for n in range(iteration):
        with open(file, "r", encoding="utf-8") as f:
            reader = csv.reader(f)
            for row in reader:
                result.append(row)
    return result

start_time = time()
result = load_csv_BY_csv_reader(file_name)
elapsed_time = time() - start_time
print("{:.3f}".format(elapsed_time), "秒")

NumPy

#!/usr/bin/python

from time import time
import numpy as np


file_name = r"C:\Users\yoshihiko\Desktop\yoshihiko.csv"
iteration = 10


def load_csv_BY_numpy(file):
    for n in range(iteration):
        csv = np.loadtxt(file, delimiter=',')
    return csv

start_time = time()
result = load_csv_BY_numpy(file_name)
elapsed_time = time() - start_time
print("{:.3f}".format(elapsed_time), "秒")

pandas

#!/usr/bin/python

from time import time
import pandas as pd


file_name = r"C:\Users\yoshihiko\Desktop\yoshihiko.csv"
iteration = 10


def load_csv_BY_pandas(file):
    for n in range(iteration):
        csv = pd.read_csv(file)
    return csv

start_time = time()
result = load_csv_BY_pandas(file_name)
elapsed_time = time() - start_time
print("{:.3f}".format(elapsed_time), "秒")

VBA

Option Explicit

Private Sub read_csv()
    Dim csv_path As String: csv_path = "C:\Users\yoshihiko\Desktop\yoshihiko.csv"
    Dim csv_file_name As String: csv_file_name = "yoshihiko.csv"
    Dim csv_sheet_name As String: csv_sheet_name = "yoshihiko"
    Dim self_file_name As String: self_file_name = Application.ActiveWorkbook.Name
    Dim i As Integer
    Dim iterate As Integer: iterate = 10
    Dim start_time As Variant
    Dim elapsed_time As Variant

    Application.ScreenUpdating = False
    start_time = Timer

    For i = 1 To iterate
        Workbooks(self_file_name).Activate
        Workbooks.Open csv_path
        Workbooks(self_file_name).Worksheets("Sheet1").Range("A1:J20000") = _
            Workbooks(csv_file_name).Worksheets(csv_sheet_name).Range("A1:J20000").Value
        Workbooks(csv_file_name).Close
    Next i

    elapsed_time = Timer - start_time
    Application.ScreenUpdating = True
    MsgBox elapsed_time & "sec"

End Sub

実験用PC

CPU : CORE i7 7th Gen ( i7-7500U 2.70GHz up to 3.50 GHz )

実験結果

  • pandasが平均1.001秒と最速。
  • pandasを基準とすると、csvは2倍遅く、NumPyとVBAは20倍遅い。
csvNumPypandasVBA
1回目2.44520.8611.15724.836
2回目2.14019.7841.01222.086
3回目2.12419.4600.94320.719
4回目2.09420.0800.95426.750
5回目2.10020.4840.94021.180
平均値2.18120.1341.00123.114

単位 : 秒

まとめ

pandasが最速。

コメント