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

今回は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」を使った方が実はパフォーマンスが良いということについてお話しさせていただきました。

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






Django

Posted by ちこ