querysetで複数updateしたいならbulk_updateの方が早いから使うべき

2021年9月11日

今回はquerysetで複数のデータに対してupdateしたいならbulk_updateの方が早いから使うべきということについてお話ししていきたいと思います。



querysetで複数updateしたいならbulk_updateの方が早いから使うべき

querysetで複数のデータに対してupdateしたいならbulk_updateの方がパフォーマンスが良いためbulk_updateを使うべきです。

今回はupdateとbulk_updateでどれくらい実行時間が異なるのか調査してみました。

調査に当たって以下のソースを準備しました。

create_data()は下準備のための関数です。
Bookモデルを使ってパフォーマンスの調査をしますが、create_data()でBookオブジェクトを1万個生成いたします。

update_test()はquerysetのupdate()をする関数です。
update()を1万個のBookオブジェクトに対して片っ端から行います。
また、timeモジュールを使ってupdate_test()の実行時間を計測します。

bulk_update_test()はquerysetのbulk_update()をする関数です。
update_test()と同じように1万個のBookオブジェクトに対して処理を行い、実行時間を計測します。

create_data()を使って1万個のBookオブジェクトを生成したのち、update_test()を3回行ってみましょう。
なお、一回処理を行うごとにオブジェクトを一旦すべてdeleteして再度create_data()を使って1万個のBookオブジェクトを生成し直しております。

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

上記の結果より、update_test()の実行時間は16秒前後という結果になりました。

一方、bulk_update_test()を3回実行してみます。
update_test()と同じように1万個のBookオブジェクトに対して処理を行い、一回処理を行うごとにオブジェクトを一旦すべてdeleteして再度create_data()を使って1万個のBookオブジェクトを生成し直すということをします。

bulk_update_test()を3回実行した結果は次の通りです。

bulk_update_test()の実行時間は2秒程度です。
update()よりもbulk_update()の方が断然早いということが分かりますね。

querysetで複数のオブジェクトに対して更新したいときはupdate()よりもbulk_update()を使用するようにしましょう。

終わりに

今回はquerysetで複数updateしたいならbulk_updateの方が早いから使うべきということについてお話しいたしました。

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

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

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

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






Django

Posted by ちこ