querysetでlen()よりcount()の方が圧倒的にパフォーマンスが良いから使うべき
今回はDjangoのquerysetでlen()よりcount()の方がパフォーマンスが圧倒的に良いからcount()を使うべきということについてお話しさせていただきます。
querysetでlen()よりcount()の方が圧倒的にパフォーマンスが良いから使うべき
まず結論として、querysetの数を調べるためにlen()よりcount()を使った方が圧倒的に早いです。
調査に当たって次のソースを準備しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from book.models import Book import time def len_test(): bookAll = Book.objects.all() start = time.time() sum = len(bookAll) process_time = time.time() - start print(process_time) print('sum:' + str(sum)) def count_test(): bookAll = Book.objects.all() start = time.time() sum = bookAll.count() process_time = time.time() - start print(process_time) print('sum:' + str(sum)) |
軽くこれらのソースについて説明すると、len_test()がlen()を使ってquerysetの数を数えてタイムを計る関数、count_test()がcount()を使ってquerysetの数を数えてタイムを計る関数です。
次のBookモデルについて調査をします。
1 2 3 4 5 6 7 |
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=120) # max_length=required author = models.CharField(max_length=120) # max_length=required price = models.DecimalField(decimal_places=2, max_digits=100, null=True) |
title、author、priceが空のBookオブジェクトを1000万個準備しました。
この1000万個のBookオブジェクトについて、len()とcount()を使ってquerysetの総数を数える時、それぞれどの程度の時間を必要とするのか調べます。
まず、len()を使ってquerysetの数を数えるlen_test()を三回実行した結果は次の通りです。
1 2 3 |
>>> len_test() 93.1647412776947 sum:10000000 |
1 2 3 |
>>> len_test() 89.60138607025146 sum:10000000 |
1 2 3 |
>>> len_test() 87.39420914649963 sum:10000000 |
およそ1分半もタイムがかかっております。
一方count()を使ってquerysetの数を数えるcount_test()を使った場合はどうでしょうか。
count_test()を三回実行してタイムを計測した結果は次のようになりました。
1 2 3 |
>>> count_test() 0.04910707473754883 sum:10000000 |
1 2 3 |
>>> count_test() 0.04334402084350586 sum:10000000 |
1 2 3 |
>>> count_test() 0.04271101951599121 sum:10000000 |
len()を使った場合と比べ物にならないほど圧倒的なスピードで処理が終わります。
querysetの総数を調べたいときは、len()よりもcount()を使用するようにしましょう。
終わりに
今回はDjangoのquerysetでlen()よりcount()の方がパフォーマンスが圧倒的に良いからcount()を使うべきということについてお話しいたしました。
PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト
ディスカッション
コメント一覧
まだ、コメントがありません