exists()を使うよりもif querysetの方が実は早い?公式ドキュメントとは逆

2021年9月11日

今回はDjangoの公式ドキュメントにはexists()を使用した方が「if queryset」を使うよりもパフォーマンスが良いと書かれていますが、調べてみたら逆の結果が出たということについてご紹介いたいます。

動作環境としてはDjangoのバージョンは3.0.1を使用しており、Pythonのバージョンは3.7.3を使用しております。



exists()を使うよりもif querysetの方が実は早い?公式ドキュメントとは逆

querysetのexists()と「if queryset」どちらが早いか調べる上で次のソースを準備しました。

mono_if_test()は「if queryset」を1万回実行する関数、exists_test()はexists()を1万回実行する関数です。
それぞれの実行時間をprocess_timeとして出力しております。

計測に当たってはあるBookオブジェクトを使用します。
条件としてBookオブジェクトの数は1つだけあります。

まずmono_if_test()を三回実行してみましょう。
mono_if_test()を三回実行した結果は次の通りです。

1万回実行しているとは思えないほどの速さですね。

続いてexists_test()を三回実行した結果を見てみましょう。

exists_test()を三回実行した結果はこちらです。

公式ドキュメントには「if queryset」よりもexists()を使った方が早いということが書かれていますが、驚くべきことに逆の結果が出てしまいました。
何か実験の方法が間違っているのでしょうか。

しかしいくらexists()より「if queryset」を使った方が早いという結果が出たと言っても誤差程度なものです。
なんせ1万回まわしてますからね。
exists()を使った方が見た目的にも分かりやすくスマートなので遅いと分かっていてもexists()を使った方が良いかもしれませんん。

終わりに

今回はexists()を使うよりも「if queryset」を使った方が実はパフォーマンスが良いということについてお話しさせていただきました。

PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いしております。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。

直接契約ができるフリーランスエージェント「エンハンス」を立ち上げました。
詳しくは下記LPをご参照ください。
https://enhance.decryption.co.jp/

Youtubeチャンネル開設いたしました。
チャンネル登録者1000人を目指しているので、良いと思った方はチャンネル登録をお願いしたいです。
https://www.youtube.com/channel/UC219XhmSRxmXltTy6COxSMw






Django

Posted by ちこ