querysetでbulk_create()とcreate()のパフォーマンス比較
今回はDjangoのquerysetでbulk_create()とcreate()のパフォーマンスを比較した結果について書きたいと思います。
querysetでbulk_create()とcreate()のパフォーマンス比較
当たり前ですが、create()よりもbulk_create()の方がパフォーマンスが良いです。
今回はどれくらいcreate()よりもbulk_create()の方がパフォーマンスが良いのか調査します。
パフォーマンス調査に当たって使用したmodelは次の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) |
パフォーマンスの調査に当たっては次のソースを準備しました。
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 create_test(): start = time.time() for i in range(10000): Book.objects.create() process_time = time.time() - start print(process_time) def bulk_create_test(): start = time.time() book_objects = [] for i in range(10000): book_objects.append(Book()) Book.objects.bulk_create(book_objects) process_time = time.time() - start print(process_time) |
titleやauthor、priceをすべて空で登録します。
それぞれcreate_test()はcreateを使って10000個のBookオブジェクトを作る関数、bulk_create_test()はbulk_createを使って10000個のBookオブジェクトを作る関数です。
create_test()とbulk_create_test()についてそれぞれ三回ずつ実行してみます。
初期条件として、Bookオブジェクトは一つもない状態でそれぞれ実行します。
1 2 |
>>> Book.objects.all().delete() (0, {'book.Book': 0}) |
createを使って10000個のBookオブジェクトを作る関数であるcreate_test()を三回実行した結果は次のとおりです。
1 2 |
>>> create_test() 15.19606614112854 |
1 2 |
>>> create_test() 15.460679292678833 |
1 2 |
>>> create_test() 13.566343069076538 |
一方、bulk_createを使って10000個のBookオブジェクトを作る関数であるbulk_create_test()を三回実行した結果は次のとおりです。
1 2 |
>>> bulk_create_test() 0.3040502071380615 |
1 2 |
>>> bulk_create_test() 0.2598707675933838 |
1 2 |
>>> bulk_create_test() 0.2691221237182617 |
圧倒的と言えるほど、createよりもbulk_createの方がパフォーマンスが良いです。
その差はなんと60倍ほどでしょうか。
bulk_createが使えるのはDjangoのバージョンが1.4からですが、複数のオブジェクトを作成したい場合はcreateよりもbulk_createを使用した方が良いでしょう。
終わりに
今回はDjangoのquerysetでbulk_create()とcreate()のパフォーマンスを比較した結果について書きました。
PythonやPythonを使ったライブラリやフレームワークのパフォーマンスの調査に興味があり、様々なコーディング方法の違いによる最適化の調査を行っております。
リストにまとめてあるので、よろしければ覗いてみてください。
Pythonとそのライブラリやフレームワークのパフォーマンス調査結果リスト
ディスカッション
コメント一覧
まだ、コメントがありません