json.dump(x,f) is much slower than f.write(json.dumps(x))
まだ誰も着手していません。
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 36k
- PR マージ指標
- PR 指標を取得中
説明
Bug report
Bug description:
Experimentally I measured a huge performance improvement when I switched my code from
json.dump(x, f, **)
to
f.write(json.dumps(x, **))
Method
I essentially wrote the same contents to different files sequentially and measured the total amount of time taken. The json contents had 1, 300, and 400 entries per level, and 1, 5, and 6 levels of depth. There's quite a level of variance here but this wasn't what I was trying to measure in the first place. I discovered this by chance, so forgive the lack of precision. I also don't have the source code anymore because I wasn't originally planning to report this discovery.
Results
| File Size | Consecutive Files | dump µs | dumps µs |
|---|---|---|---|
| 74 | 1 | 508 | 581 |
| 74 | 2 | 520 | 541 |
| 74 | 4 | 1153 | 1151 |
| 74 | 8 | 1930 | 1750 |
| 39184 | 1 | 6363 | 1086 |
| 39184 | 2 | 11261 | 1821 |
| 39184 | 4 | 38126 | 3521 |
| 39184 | 8 | 80411 | 6466 |
| 468218 | 1 | 82821 | 11921 |
| 468218 | 2 | 150234 | 38017 |
| 468218 | 4 | 302357 | 42137 |
| 468218 | 8 | 573450 | 78545 |
Conclusion
A cursory investigation into the cpython code suggests that the slow part is the sequential writing of the iterencode yield. The chunks are quite small.
CPython versions tested on:
3.10
Operating systems tested on:
macOS
Linked PRs
- gh-130076
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、リンクされた PR gh-130076 と、iterencode からの逐次書き込みに関係する CPython の JSON コードを確認します。報告されている dump-versus-dumps の時間計測を再現し、その後、出力を変更せずに大きなケースで dump のパフォーマンスが改善されることを検証します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- backend
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100