exists()を使うよりもif querysetの方が実は早い?公式ドキュメントとは逆
今回はDjangoの公式ドキュメントにはexists()を使用した方が「if queryset」を使うよりもパフォーマンスが良いと書かれていますが、調べてみたら逆の結果が出たということについてご紹介いたいます。
動作環境としてはDjangoのバージョンは3.0.1を使用しており、Pythonのバージョンは3.7.3を使用しております。
exists()を使うよりもif querysetの方が実は早い?公式ドキュメントとは逆
querysetのexists()と「if queryset」どちらが早いか調べる上で次のソースを準備しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from book.models import Book import time def mono_if_test(): bookAll = Book.objects.all() print(bookAll) start = time.time() for i in range(10000): if bookAll: pass process_time = time.time() - start print(process_time) def exists_test(): bookAll = Book.objects.all() print(bookAll) start = time.time() for i in range(10000): if bookAll.exists(): pass process_time = time.time() - start print(process_time) |
mono_if_test()は「if queryset」を1万回実行する関数、exists_test()はexists()を1万回実行する関数です。
それぞれの実行時間をprocess_timeとして出力しております。
計測に当たってはあるBookオブジェクトを使用します。
条件としてBookオブジェクトの数は1つだけあります。
まずmono_if_test()を三回実行してみましょう。
mono_if_test()を三回実行した結果は次の通りです。
1 2 3 |
>>> mono_if_test() <QuerySet [<Book: Book object (1)>]> 0.007416725158691406 |
1 2 3 |
>>> mono_if_test() <QuerySet [<Book: Book object (1)>]> 0.006607770919799805 |
1 2 |
<QuerySet [<Book: Book object (1)>]> 0.006623029708862305 |
1万回実行しているとは思えないほどの速さですね。
続いてexists_test()を三回実行した結果を見てみましょう。
exists_test()を三回実行した結果はこちらです。
1 2 3 |
>>> exists_test() <QuerySet [<Book: Book object (1)>]> 1.8189609050750732 |
1 2 3 |
>>> exists_test() <QuerySet [<Book: Book object (1)>]> 1.8021199703216553 |
1 2 3 |
>>> exists_test() <QuerySet [<Book: Book object (1)>]> 1.7510919570922852 |
公式ドキュメントには「if queryset」よりもexists()を使った方が早いということが書かれていますが、驚くべきことに逆の結果が出てしまいました。
何か実験の方法が間違っているのでしょうか。
しかしいくらexists()より「if queryset」を使った方が早いという結果が出たと言っても誤差程度なものです。
なんせ1万回まわしてますからね。
exists()を使った方が見た目的にも分かりやすくスマートなので遅いと分かっていてもexists()を使った方が良いかもしれませんん。
終わりに
今回はexists()を使うよりも「if queryset」を使った方が実はパフォーマンスが良いということについてお話しさせていただきました。
PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト
ディスカッション
コメント一覧
まだ、コメントがありません