Rust製の爆速Pythonパッケージ管理ツール uv
引用元:https://news.ycombinator.com/item?id=44357411
以前はvenvとpipで十分って思ってたけど、共有サーバーでpipが遅いしキャッシュで容量食うしで困ってuvにしたら全部うまくいったんだ。
まだ使ってないなら、たった5分試してみて損はないよ。
uvはmiseみたいなもっといろんな言語に対応してるツールと比べてどうなんだろう?
俺はmiseにASDFから乗り換えたんだけどさ。
req.txtなんてマジ最悪。
uvとかPoetry, PDMみたいな新しいツールを使ったら、もうpipとreq.txtには戻れないよ、マジでめちゃくちゃだから。
uvは超速くて最高だけど、まだちょっと荒削りなとこやバグもあるね。
pipのキャッシュが容量食ってたって話だけど、uvはストレージの使い方うまい?
もしそうなら、具体的にどうやって?(共有したりとか?)
俺たちはpyproject.tomlからreq.txtを作るのにuvを使ってるよ。
ロックされたバージョンを得るためにね。
Makefileでの例はこんな感じ。
<code>uv pip compile pyproject.toml -o requirements.txt</code>
<code>uv pip compile –extra=dev pyproject.toml -o requirements.dev.txt</code>
2009年頃にpipとvenvを使ってたの覚えてるな。
5〜10年前に確認した時は、コミュニティではDocker使うのが主流って話だったけど、今はそうじゃないの?
コメント5のreq.txtを作るのって何のため?
古いCI/CDパイプラインをサポートするためとか?
uv.lockでロックされたバージョンとか全部含まれてるんだから、それで十分じゃない?
uvのマジで最高な機能は、これまでのvenvを使ったやり方とそのまま使えること。
ただ<code>uv venv</code>って打てばいいんだぜ。
uvは大好きだけど、一つだけ注意点がある。
uvxだけは触るな。
あれで何時間も無駄にしたんだ。
なんであれがあるのかは分かるけど、組み込みのフットガン(危険な機能)だと思うよ。
uvxを避けていれば、問題なく使えるさ。
残念だけど、uWSGIみたいにすごく大事なライブラリがuvと根本的に互換性がないんだ。
そのせいで、カスタムuWSGIを使ってる俺のアプリは全部ロールバックしなきゃいけなかったよ。
俺がuvに乗り換えてないのはRuffでの経験があるからなんだよね。
Ruffは「Flake8、isort、Blackとドロップインパリティ」って言うけど、あれ全然本当じゃない。
少なくともisortに関しては、Ruffは自分たちがやりたいことだけ再実装して、もし機能とか設定が足りないなら、Ruffから昔のisortツールを呼び出せって言うんだよ。それ何の意味があるの?
Ruffはただ既存のいろんなツールを部分的に再実装して、新しいのをちょっと追加しただけじゃん。
だからRuffを使うと、結局使うツールの数はまた増えることになるし、Pylintがやってること全部はやってくれない。
uvへの移行については、Poetryより「速い」ってこと以外に、どんなメリットがあるのか良い話を聞かないんだよね。
今唯一知ってるユニークな点は、uvがPython自体をインストールできることで、Pyenvみたいなツールがいらなくなることくらいかな。
それは興味あるけど、「速い」だけじゃ十分な理由にならないんだよ。
興味本位なんだけど、何が上手くいかなかったの?
俺はmiseの中で(そして外でも)Justをよく使ってるよ、ほとんど埋め込みシェルとかPythonスクリプトでね。
miseのタスクもちょっと使ったけど、俺にはそんなに便利さを感じなかったかな。
それともShebang付きのJustfileのこと?
どっちにしても、どんな問題に当たったか知りたいな(手伝えるかもだし)。
uvは同じパッケージをハードリンクするから、仮想環境を追加しても容量がすごく少なくて済むんだよ。
pipもuvもパッケージは~/.cacheにキャッシュするんだけど、uvはそれを/tmpに変えたり、コピーじゃなくてシンボリックリンクにしたりできるんだ。
ただし、マウントポイントを跨いじゃう場合は別だけどね、uvがちゃんと警告してくれるから大丈夫。
俺は両方使ってるよ!
uvはmiseでグローバルに入れた。
それでuvのツールは“mise use -g pipx:foo”みたいに管理できるんだ。
パッケージ管理ツールの「これが正解」みたいなアドバイスって毎年変わるよね。
ちょっと前はvenvだったのに、pipenv、poetry、docker、そして今はuv。
これでエコシステムが落ち着いてくれるといいけど、どうなるかな。
俺にとって一番大きかったのはね、uvが説明するのがめちゃくちゃ簡単で、特にPythonを毎日書くわけじゃない人にとって、使うのが本当に楽ってこと。
pipとかだと、コンフィグファイルとvenvで、まず適切なvenvを用意するのに2ステップくらい覚えなきゃいけない — 作って、そこにインストールする — し、テスト実行とかスクリプト実行するたびに、変なShebang形式か、venvをactivateすることを覚えなきゃいけない。
エラーメッセージも全然助けにならないし。まぁ、あのセットアップは標準化されてないし公式にお墨付きがあるわけじゃないから仕方ないのかもだけど。
とにかく、「Import Errors」とvenvを脳内で繋げる作業を叩き込まないといけないんだよね。
できなくはないけど、慣れてない人にこれを教える時に、ツール全体がどれだけ…「ややこしい」って言葉が良いかな…かを思い知らされたよ。
それが今、チームメンバーは「uv run」、「uv add」、「uv sync」だけ覚えればいいんだ。
これで全体がすごく楽になったし、彼らにとっても全然抵抗がなくなったね。
uvはnpmとかああいう感じだと思っていいよ。
新しいPythonのpyproject.tomlはpackage.jsonに似てて、プロジェクトの説明とか依存関係を定義するんだ。
uvはこれを使うツールで、依存関係管理、ビルド、PyPi公開、テストとかのフック追加がすっごく簡単。
package.jsonとかなり似てるね。
仮想環境も自動で面倒見てくれるけど、自分でやってもOKだよ。
君はuvがどれだけ“速い”か、多分甘く見てるね。
マジで全然違うんだよ。
僕が切り替えた理由であり、今も言ってるのが、「uvは速すぎて、何かやってるか分からないくらい」って言葉。
最初に使った時、ちゃんと動いてるか確認したもん。
使わない理由(別のマネージャー不要とかpipで十分とか)も聞いたけど、正直あんまり納得できないかな。
でもpoetry使ってるなら、絶対乗り換えるべき!
uvは待ち時間がないpoetryだよ。
一番複雑なやつでも一日でいけるはず。
僕が時間かかったのはdockerをuv用に組み直したからだけど、それはdockerのせいであってuvのせいじゃないよ。
あー、なるほどね、ありがとう!
もしかしたらもう直ってるかもだけど、
もっと色々移す前に、今すぐ試してぶっ壊してみるつもりだよ。
ユーザーのホームのキャッシュフォルダに、インストールした全パッケージのグローバルキャッシュがあるんだ。
最近、実験的なリポジトリで似た話あったね。「ちょー簡単、$uv a b cだけ」ってやつ。
裏側は結構無駄があるっぽい?
でもね、標準のGNU-Debian-Ubuntu環境で問題なくスムーズに動いたんだ。
俺も自分で切り替えてみたんだ。
思ってたよりずっと簡単でスムーズだったね。
俺は「別に試す必要ないな」ってコメントしに来たんだけど、
そのコメント読んで、今すぐ試してみようって気になったよ!
マジそれ!
最近miseで開発環境いくつか作ったんだけど、古いのはpoetryで新しいのはuvなんだ。
uvはマジでサクサク動くね。
夜と昼くらい違うよ!
Pip-toolsとrequirements.txtで乗り切ってきたけどさ、uv試したらマジでもう戻れないね!超速くて便利なんだわ。
uv初めて使った時、あまりに速すぎて絶対なんか間違えたと思ったよ!pipとは全然違う速さだったね。
uvでも200msかかることあるし、エンター押してからプロンプト出るまで微妙に遅延感じるんだよね。Poetryならコーヒー淹れて待てば終わってるのに。
pipenvやPoetryが出てきた時も、きっと同じこと言われてたんだろうね。なんか面白いわ。
もっとコメントを表示(1)
前の会社でPoetryが依存関係の解決に何分もかかったことがあったよ。絶対壊れてると思ったけど、まぁ最後には終わったかな。
Poetryが遅すぎて待ってられなくてさ、キャッシュとリスト全部消してパッケージ再インストールした方が早いと思ったことあるわ。uv試したら即乗り換えたね。
lol。うんうん、俺もやったやった。haha。前の会社はpoetry.lockの大量更新にめちゃ厳しかったから、あの時はできなかったけどね。
俺も同じくlol!マジでスムーズすぎてPythonじゃないみたいだよ。
そりゃそうだ、Rust製だからね。😊
俺もつい先週同じ経験したとこでさ、絶対おかしいだろって思ったよ。もう完全に乗り換え組だね。
俺もそうだよ!
最初は疑ってたけど、使ってみたら手放せなくなったわ。
まじ爆速!
uvとruffは”車輪の再発明はするな”って意見への反例だね。
ただやるんじゃなくて、目的があれば桁違いに良いものを作れるんだ。
Pythonのパッケージ管理の歴史を見ると、みんな今のやり方より良いものが作れるって思ってるのがよく分かるね。
車輪を再発明したんじゃなくて、”ただ”木をもっと丈夫な素材に変えて、10倍速く回れるようにしたってことだね!
正直、「車輪の再発明はするな」って言葉、全く意味分かんないんだよね。
いつまでも木製の円盤を車輪にしてるわけじゃないだろ?
もっと良い車輪はずっと発明してきたんだから、ソフトウェアでも同じことやろうぜ!
具体的に何が変わって速くなったのか気になるな。
PythonからRustに変えただけでネットワークやファイルI/Oは速くならないでしょ?
多分、良いアルゴリズムを選んだり、並列化したりしたおかげだと思うんだ。
PythonかRustかっていうよりね。(Pythonで並列化しにくくてRustで簡単なら話は別だけど)
uvは純粋にパフォーマンスを良くしただけなんだ。
Pythonの環境管理とかパッケージングの仕組み自体は何も変えてないよ。
改善はPythonビルドシステムエコシステム全体の頑張りと合意形成のおかげなんだ。
”桁違いに良い”って言葉について。
関係ないけど、”10倍”っていう短い言い方があるのに、なんでそのフレーズ使うんだろうね?不思議。
いや、実は違うんだ。
uvの主な違いの一つは、もうvenvのこと考えなくていいってことだよ。
最近のPyConで作者の一人が話してる動画がこれだよ:
https://www.youtube.com/watch?v=CV8KRvWKYDw
(他の場所で貼ったのとは別の動画ね)
XMLがあるのにJSONを発明した理由を聞かれた時、Douglas Crockfordは言ったんだ。
「車輪を再発明することの良い点は、丸いものが手に入ることだ」ってね。
https://scripting.wordpress.com/2006/12/20/scripting-news-fo…
uvってどうやって動くの?venvを作るんだよ。ここで言うのはPEP 405の概念で、Pythonの”venv”モジュールじゃないからね。
プログラムはいつも外部リソース待ちだからスクリプト言語の遅さは関係ないって言うけど、それウソだよ。計算が多い場合や、抽象化を重ねるとマジで遅くなる。プロファイルしたことないなら絶対やるべき!
あと、動的言語はマルチスレッドが苦手。コンパイル言語にすると100倍速くなることもザラにあるんだ。
動的言語がダメってわけじゃなくて、パフォーマンスの現実を知ってほしいんだよね。
実装の細かいことはどうでもいいんだよ。uvはPEP 405に従ってるかもだけど、そうじゃなくてもうまくいく。
大事なのは、他のPythonパッケージ管理ツールにあるような余計な面倒なことがないってこと。
uvがインタープリターの切り替えをすごく簡単にするところには同意しないな。3.11から3.12へ簡単に変えられるのはpybiの考え方だ。
他のツールでもできるけど、uvに組み込まれてると違う設定をブートストラップしやすいんだよね。
uvがPEP 405に従ってるってのは超大事なんだよ。それがuvを単なる実装の一部にしてるんだ。
uvを他のツールと入れ替えても開発環境を変えなくていい。
これこそが標準の目的なんだから。
> 動的スクリプト言語はマルチスレッドとか複数コア使うのが苦手…
この制限がない動的スクリプト言語ってどんなのがあるの?例を教えてほしいな。
私、その辺詳しくないんだよね。
低レベル言語が速いのは分かるけど、パッケージマネージャーって計算そんなにしないんだよ。
主な仕事はダウンロード、解凍、ファイル書き込み。
依存関係の制約解消もボトルネックじゃない。
JavaScriptなら1000件並列ダウンロードとか超簡単だよ。解凍や書き込みも並列でいけるはず(Pythonは知らないけど)。
確かにpyenvより速くて良いけど、仮想環境っていう仕組み自体はuvが発明したわけじゃないんだ。
uvは他のツールよりPythonエコシステムを上手くやってるけど、やってることは関連するPEPで決まってる標準的なことだよ。
JSONのどこが変なの?
個人的にはバイナリデータに対応してないのが残念なくらいかな。
base64にするのがちょっと面倒だよね。
「order of magnitude」って言葉、対数スケールでしょ。3.16倍から31.6倍くらいの間ってことだと思うよ。
標準に従うってことは、昔のPythonの失敗を永遠に残すってことじゃない?標準があるから進歩できないんでしょ。uvがすごいのは標準に従ってない部分でしょ、きっと。
ロックファイルって標準で決まってるの?それともuv独自の仕様なの?
uvが他のより全然速くないって言ってるけど、それは間違いだよ。実際は速いんだ。Pythonはみんなが思ってるよりずっと遅いんだよ。エンジニアはそれに気づいてない人が多いんじゃないかな。
標準がいっぱいあってカオス、みたいなxkcdの漫画あるよね、それだ。
もっとコメントを表示(2)
車輪の再発明って言うけどさ、車のタイヤだって昔と今じゃ全然違うでしょ?技術が進歩すれば見た目は同じでも性能は全然違うものになるんだよ。uvもタイヤみたいなもんじゃない?
「車輪の再発明」って、車輪っていう概念そのものを再発明するって意味だと思ってた。Boring companyとかTeslaが考えてる地下トンネルのやつみたいにね。速いパッケージマネージャーはただの速いパッケージマネージャーで、概念は変わらないんじゃない?
Pythonのパッケージ管理、マジでひどかったよね。みんな同じ失敗繰り返してただけ。でもuvは初めてその悪い流れを断ち切ったんだ。PythonじゃなくてRustで作られてるからかな。
Rustだから速いんじゃなくて、アルゴリズムと設計のおかげで速いんだよって話だよ。
uvの動画でもRustじゃなくて設計での最適化が主な高速化要因だって言ってた。
あと、人を馬鹿にするのはやめな。
C/C++とかassemblyでAAAゲーム作ったことあるから、最適化や動的言語のことも知ってるんだ。
「Rustだから速い!」って嘘に騙されないで。
速い理由はそこじゃないんだよ。
ちょっとした注意点なんだけど、すごく低スペックな環境(例えばAWS T2.microでWindowsとか)だと、uvが同時にダウンロードしすぎてタイムアウトすることがあるよ。
そんな時は、環境変数UV_CONCURRENT_DOWNLOADSを使ってダウンロード数を1とか2に制限すると良いよ。
これは極端な例だけど、uvはモジュールごとにスレッド作るのが積極的すぎると思うんだ。
サーバーごとの通信速度を見て自動調整するべきじゃないかな。
全然極端じゃないよ。
みんな趣味の開発とかで一番安くて小さいVPSよく使うもん。
私も使ってるよ(AWSじゃないけど)。
情報共有ありがとう!
uvが自動で検知してくれるようになると良いね。
uvは大規模プロジェクトだとファイルディスクリプタが足りなくなったりすることもあるし、インストールが毎回同じ結果になるわけじゃない(再現性がない)んだ。
まだ成熟が必要だね。
uvのuv add <mydependencies> –script mycoolscript.pyって書き方と、#!/usr/bin/env -S uv runをスクリプトの先頭につけるのがすごく気に入ってるよ。
これでPythonスクリプトを簡単に実行できるのが最高!
uvのinline dependency機能を使って、AI(Claude)に指示書なしでPythonスクリプト作らせてみたんだ。
URLを指定したら、httpxとbeautifulsoupを使ってスクレイピングして、ページのリンク(URLとテキスト)をCSVで返すスクリプトだよ。
ちゃんとdependenciesも指定してくれた。
ここでその結果が見れるよ: https://claude.ai/share/57d5c886-d5d3-4a9b-901f-27a3667a8581
去年Simon Willisonさんの投稿見てから、彼のuvシステム指示をLLMでいつも使わせてもらってます、ありがとう!
「XYZのPythonスクリプトちょうだい」ってAIに頼んで、uv runで実行できるのがめちゃくちゃ便利だよ。
AIがdependenciesがインストールされてないって困ったり、起動方法を知らなかったりすることが多いから、「実行する時はuv run script-name.pyを使ってね。
dependenciesは自動でインストールされるから。Stdlibsはdependencies配列に書かなくていいよ」って指示も追加したんだ。
AIがStdlib(例えばjson)をdependenciesに入れようとして混乱するのを防ぐためだよ。
私の経験だと、Claude Sonnetはuv scriptの書き方を忘れちゃうことが多いんだよね。
だいたいuv projectの書き方を使いたがるから、毎回ドキュメントをコピペして教えてあげてる感じ。
俺が見つけてきてやったぜ。
これ見てくれよ → https://github.com/shakefu/cursor-rules/blob/f4dffbbf04ce99f…
Marimo.ioとuvの組み合わせ最高!uv入れるだけで再現性高いアプリすぐ作れるんだって。めっちゃホットな組み合わせだね!
uvのおかげで、環境管理とか気にせず気軽にスクリプト書けるようになったんだ。超便利だよ!
詳しくはこれ見てね!
https://everything.intellectronica.net/p/the-little-scripter
https://www.youtube.com/watch?v=8LB7e2tKWoI
https://github.com/intellectronica/ez-mcp
ごめん!前のコメントの例を勘違いしてたわ。指摘は無視してね。プロジェクトでuv add --script
を使う話をuv add
と間違えてただけ。彼らはドキュメントいっぱい載せてるけど、run --with
かPEP723サポートがもっと気に入ると思うよ。ドキュメントのリンクこれね!
https://docs.astral.sh/uv/guides/scripts/
あれ?そのPEP723サポートって、最初のコメントの人がまさに使ってることじゃないの?
「mydependencies」って何?設定ファイルのこと?
ごめんね、「mydependencies」はPyPIから取ってくるパッケージのことだよ。pip install ...
みたいな感じで使うやつね。
最近使い始めたんだけど、pipに慣れてると速すぎてマジで混乱する!終わったのか分かんないくらいあっという間だったんだよね…
ちょっと前にuv試したんだけど、速さと使いやすさにマジで衝撃受けたよ。もうpip使う理由ないし、Pythonだけならcondaもいらないんじゃない?
pyenvとかpoetryもいらなくなりそう!