世界を動かす技術を、日本語で。

uv: ホイールキャッシュ内のすべてのファイルの重複を削除する

2026年8月31日原文(github.com)

概要

このドキュメントは、uvのバッファ再利用・キャッシュクリーンアップ・依存関係管理などの最適化PRの詳細とベンチマーク結果をまとめたものです。 主にmacOSとLinux上でのパフォーマンス改善が報告されています。 バージョン0.12.8での主な新機能やバグ修正も記載しています。 内容は技術的な詳細と各種リリースノートを含みます。 依存関係管理や自動アップデートの設定についても触れています。

uv パフォーマンス最適化PRの概要

  • content hashing有効時のバッファ再利用 によるメモリアロケーション削減

    • これまでファイルごとに64KiBバッファを新規確保していた仕様を、wheel全体で1つのバッファを使い回す方式に変更
    • PyTorch wheelのベンチマークでは、バッファ確保回数が11,120回から1回に減少
    • バッファサイズはアクティブwheelごとに64KiBを維持
  • ベンチマーク結果(#21327時点と最適化適用後の比較)

    • AnyIO: 110ms → 107ms(-2.6%)
    • SymPy: 845ms → 775ms(-8.3%)
    • NumPy: 627ms → 567ms(-9.5%)
    • PyTorch CPU: 6.50s → 5.99s(-7.8%)
    • 14パッケージ環境(並列度4): 6.95s → 6.47s(-7.0%)
    • 全672回のインストールで計測、キャッシュ済みインストールやローカルwheelでは変化なし
  • macOS向けキャッシュクリーンアップ高速化

    • cache cleanup時、全files-v0オブジェクトのハードリンク数を個別に取得していた処理を、getattrlistbulkでバッチ取得に最適化
    • 87,129個の空ファイルオブジェクト(2ハードリンク/obj, 256 shard)の全走査コマンド実行時間
      • uv cache clean <package>: 386ms → 105ms
      • uv cache clean <10 packages>: 389ms → 104ms
      • uv cache prune: 386ms → 101ms
    • スキャンはシングルスレッドで実行、削除スループットではなくスキャン速度を計測

uv v0.12.8 リリースノート要約

  • 機能強化
    • uv tool upgrade --allで無効なツールディレクトリを警告しつつ有効ツールのみアップグレード
  • プレビューフィーチャー
    • content-addressed-cacheプレビュー: キャッシュ内の同一ファイルを重複排除
    • content-addressed wheels展開時のハッシュバッファ再利用によるメモリ削減
    • macOSでのキャッシュクリーンアップ高速化(ハードリンク数を一括取得)
  • パフォーマンス改善
    • 複数uvプロセスによる同一リモートwheelの重複ダウンロード・展開防止
    • 大規模lockfileからの依存関係グラフ構築の高速化(パッケージインデックス化)
    • lockfileトラバーサルの最適化(exports, dependency trees, audits, freshness checksへの拡張)
    • マーカーinternerの再利用によるウォーム解決高速化
  • バグ修正
    • wheelメタデータでのみ発見されたdirect URLのハッシュを--require-hashes時に信用しない
    • Azure Storage APIバージョン互換対応、認証リトライ対応
    • Azure shared access signature (sig)クエリパラメータのURL表示からの除去
    • ワークスペース検出時、1階層下のworkspace member glob配下プロジェクトを単独プロジェクトとして扱う
  • その他
    • astral-tokio-tarの0.7.0へのアップデート、ハードリンク抽出時の実サイズ利用

依存関係管理・自動アップデート設定

  • Renovate CLIによる依存パッケージの自動管理
    • ghcr.io/astral-sh/uvのパッチアップデート(0.12.70.12.8
    • スケジュールや自動マージ設定
    • 依存取得エラー時はDependency Dashboard参照を推奨
    • PRのrebase/retryも手動で可能

参考リンク・著者情報

Hackerたちの意見

みんなuvが速いからいいって言うけど、正直それはどうでもいい。Pythonベースのツールの配布に使うように切り替えたのは、gitリポジトリから直接インストールできて、その後も同じリポジトリから更新できるのがめっちゃ便利だから。パッケージをビルドする必要もないしね。

先日、初めてうまく試してみたんだ(数ヶ月前に1回失敗したけど)。システム全体のインストールやvenvを10年近くやってきた後のこと。全然速いとは思わなかった。スクリプトを実行するたびに、依存関係をチェックするのに数秒かかってたし。ある時は一つ更新したけど、運良く何も壊れなかったからよかったけど、ちょっと心配になった。使うべきフラグがあったかもしれないけど、uvxはあんまり良くなかったな。一方で、pipよりはパッケージをインストールするのが速い気がした。

もしかしたら誤解してるかもしれないけど、それはuvの特別な利点じゃないよ。pipは何年も前からこれができてたんだから。pip install git+https://github.com/some-org/repo

uvは現代のPythonライブラリの基盤だよ。https://stephenlf.dev/blog/python-library-in-2026/

スピードの議論には今まで納得できなかったな。確かに明らかに速いけど、私のプロジェクトでは1秒対0.1秒で、意味のある違いにはならない。彼らのベンチマークでも、pipの最悪の数字は7秒だし[1](その数字は2年以上前のもので、Pythonの改善でpipはもう少し良くなってるはず)。依存関係をインストールするのに7秒余分にかかることなんて、正直どうでもいい。CIがどれくらいかかるかも気にしないし、バックグラウンドで動いてるのがポイントだからね。唯一使えるのは、インライン依存関係のあるスクリプトを実行する時かな。pipxよりも明らかに改善されてると思う。でも、それは毎回依存関係を解析する必要があるからで、定期的に使うものなら普通にインストールしちゃうし、その方が速いよ。[1] https://github.com/astral-sh/uv/blob/main/BENCHMARKS.md

私にとって、uvの一番面白くない部分はスピードだよ。私が気に入ってるのは、インストールしたPythonのバージョンを管理したり、プロジェクト用にローカルの.venvを自動で作成してくれたりすること(pipenvみたいに、どこにでもvenvをインストールするのは好きじゃない)。pyproject.tomlのサポートもあって、その中で宣言されたPythonのバージョンも含まれてるし、依存関係を持つスクリプトを実行できるのもいいね。これらはuvだけの特徴ではないと思うけど、すべてを信頼性高く、簡単にインストールできて、使いやすいんだ。私の使い方に関しては、DXの観点から、poetryやpipenv、pyenv(Pythonバージョン管理用)やpipを超えてるよ。

一般的なPythonパッケージに比べると大したことじゃないけど、uvxでツールを実行したり、スクリプト内のインライン依存関係がある場合、スピードがいい感じになるケースがいくつかあるよ。ツールやスクリプトを初めて実行したときには何かがインストールされるのが見えるけど、通常は速すぎて気づかないことが多い。もう一つの人気ツール、condaと比較することもできるけど、condaは超遅いから、それはちょっと不公平かもしれないね。もっと一般的に言えば、それでもいいことだと思う。ちょっとした摩擦が少なくなるだけでも、数秒遅くなるだけで行動が変わることもあるし。

ファイルレベルでの重複排除: すべてのファイルはそのBLAKE3ハッシュの下に保存される。Blake3は本当に素晴らしく速い暗号ハッシュだよ。自分の「重複排除 / 整合性 / バーサーカー」ユーティリティに使ってる(これはLLMが出る前に作ったやつ)。もしファイル名がDSC98731-b3-7b39197a22.JPGだったら、- そのファイルが7b39197a22にチェックサムが戻らなかったら、ファイルの整合性に問題がある(すごいし、実際にトラブルシューティングに役立った) - 他のファイルが同じBlake3の7b39197a22ハッシュを持ってたら、それは重複 - もしその7b39197a22チェックサムが自分のデータベースにあったら、「何かが起こる」可能性がある。例えば、DBが「7b39197a22のBlake3ハッシュを持つファイルは常に削除できる」とか、「887463c09eのBlake3ハッシュを持つファイルは、もし一般的なファイル名(dscXXXXXみたいな)なら、常に「20260722jackJohnAtTheBeach-b3-778463c09e.jpg」にリネームできる」とかね(好きなように)。本当に素晴らしいし、ここにも似たような仕組みを独自に作った人が何人かいるのを知ってるよ。Blake3はそういう用途にぴったりなハッシュだね。

私みたいに気になってる人へ: Blake3は少なくとも224ビットのハッシュを生成するよ。コメントを文字通り読むと40ビットになるけど、これはファイルの重複排除には良くない(約100万ファイルで50%のハッシュ衝突が起きる)。

ほとんどのファイルフォーマットが自分のコンテンツをチェックサムしないのはイライラする。SQLiteみたいにもっと賢いはずのフォーマットも、ファイルシステムにそれを任せてるけど、ほとんどのファイルシステムもチェックサムを取ってないし、さらにストレージに任せてる。PostgreSQLはその品質と信頼性を誇ってるけど、チェックサムをデフォルトでオンにしたのは最新のバージョン18から。これが.zipファイルをファイルフォーマットとして使う大きな利点で、これを無料で得られるんだ。

BLAKE3のもう一つの面白いところは、マークルツリーであることだね。これによって、良い並列処理ができるだけじゃなくて、データ転送に関してもいろんなクールな特性があるんだ。例えば、部分的な有効性をチェックできるから、ストリーミング中のエラー検出や再送が可能になるんだよ。データとチェックサムさえあれば、1つ以上のサブツリーを再構築し始めることができるんだ。

自分の「重複排除 / 整合性 / バーサーカー」ユーティリティに使ってるんだけど、公開リポジトリにある?

Hacker Newsで議論の続きを見る