PandasのDataFrameで空かどうか判定するためにパフォーマンスの最も良い方法
今回はPandasのDataFrameで空かどうか判定するためにパフォーマンスの最も良い方法についてご紹介いたします。
PandasのDataFrameで空かどうか判定するためにパフォーマンスの最も良い方法
PandasのDaraFrameで中身が空かどうか判定するためには、次の三つがあります。
dfをDataFrame型の変数として、
df.empty
len(df)
len(df.index)
で空かどうか判定することができるようです。
この中では、
len(df.index)
len(df)
df.empty
の順でパフォーマンスが良い(=速度が早い)そうです。
直観的には信じ難いので、それが本当かどうか調べてみました。
パフォーマンスの速度チェック
パフォーマンスの調査に当たって、次のソースコードを用意しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import pandas as pd import time def emptyTestNoExist(): df = pd.DataFrame() print('df') print(df) start = time.time() for i in range(1000000): df.empty process_time = time.time() - start print(process_time) def lenTestNoExist(): df = pd.DataFrame() print('df') print(df) start = time.time() for i in range(1000000): len(df) process_time = time.time() - start print(process_time) def lenIndexTestNoExist(): df = pd.DataFrame() print('df') print(df) start = time.time() for i in range(1000000): len(df.index) process_time = time.time() - start print(process_time) def emptyTestExist(): df = pd.DataFrame({'numbers': [1, 2, 3], 'colors': ['red', 'white', 'blue']}) print('df') print(df) start = time.time() for i in range(1000000): df.empty process_time = time.time() - start print(process_time) def lenTestExist(): df = pd.DataFrame({'numbers': [1, 2, 3], 'colors': ['red', 'white', 'blue']}) print('df') print(df) start = time.time() for i in range(1000000): len(df) process_time = time.time() - start print(process_time) def lenIndexTestExist(): df = pd.DataFrame({'numbers': [1, 2, 3], 'colors': ['red', 'white', 'blue']}) print('df') print(df) start = time.time() for i in range(1000000): len(df.index) process_time = time.time() - start print(process_time) |
それぞれの関数は、
emptyTestNoExist…df.emptyでチェック。データなし
lenTestNoExist…len(df)でチェック。データなし
lenIndexTestNoExist…len(df.index)でチェック。データなし
emptyTestExist…df.emptyでチェック。データあり
lenTestExist…len(df)でチェック。データあり
lenIndexTestExist…len(df.index)でチェック。データあり
です。
これらを3回ずつ実行してみると、結果はそれぞれ次のようになりました。
一回目
関数 | 1回目 | 2回目 | 3回目 |
---|---|---|---|
emptyTestNoExist | 2.0883066654205322 | 2.0779144763946533 | 2.037778615951538 |
lenTestNoExist | 0.6067044734954834 | 0.5910563468933105 | 0.6345944404602051 |
lenTestNoExist | 0.42269444465637207 | 0.41591596603393555 | 0.43253040313720703 |
emptyTestExist | 3.1654932498931885 | 3.1807096004486084 | 3.211366653442383 |
lenTestExist | 0.5770201683044434 | 0.6047067642211914 | 0.5991582870483398 |
lenIndexTestExist | 0.4429199695587158 | 0.43631410598754883 | 0.4301869869232178 |
確かに
len(df.index)
len(df)
df.empty
の順でパフォーマンスが良かったです。
少し可読性が落ちる気がしますが、
len(df.index)
を使った方がパフォーマンス的には最も良さそうです。
終わりに
今回はPandasのDataFrameで空かどうか判定するためにパフォーマンスの最も良い方法についてご紹介いたしました。
PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト
ディスカッション
コメント一覧
まだ、コメントがありません