A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.md 58KB

7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. title: uv: Python packaging in Rust
  2. url: https://astral.sh/blog/uv
  3. hash_url: 359df603dbf60e8476027b2eb26cb7ce
  4. archive_date: 2024-02-17
  5. og_image: https://astral.sh/static/OpenGraph/Astral.jpg
  6. description: uv is an extremely fast Python package installer and resolver, designed as a drop-in alternative to pip and pip-tools.
  7. favicon: https://astral.sh/static/favicon-32x32.png
  8. language: en_US
  9. <p><strong>TL;DR:</strong> <a href="https://github.com/astral-sh/uv">uv</a> is an <strong>extremely fast Python package
  10. installer and resolver</strong>, written in Rust, and designed as a drop-in replacement for <code>pip</code> and
  11. <code>pip-tools</code> workflows.</p>
  12. <p><a href="https://github.com/astral-sh/uv">uv</a> represents a milestone in our pursuit of a <a href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html#pillars-of-cargo">"Cargo for Python"</a>:
  13. a comprehensive Python project and package manager that's fast, reliable, and easy to use.</p>
  14. <p>As part of this release, we're also taking stewardship of <a href="https://github.com/mitsuhiko/rye">Rye</a>,
  15. an experimental Python packaging tool from <a href="https://github.com/mitsuhiko">Armin Ronacher</a>. We'll
  16. maintain <a href="https://github.com/mitsuhiko/rye">Rye</a> as we expand <a href="https://github.com/astral-sh/uv">uv</a> into a unified successor
  17. project, to fulfill our <a href="https://rye-up.com/philosophy/">shared vision</a> for Python packaging.</p>
  18. <hr>
  19. <p>At Astral, we build high-performance developer tools for the Python ecosystem. We're best known
  20. for <a href="https://github.com/astral-sh/ruff">Ruff</a>, an extremely fast
  21. Python <a href="https://notes.crmarsh.com/python-tooling-could-be-much-much-faster">linter</a>
  22. and <a href="https://astral.sh/blog/the-ruff-formatter">formatter</a>.</p>
  23. <p>Today, we're releasing the next tool in the Astral toolchain: <strong><a href="https://github.com/astral-sh/uv">uv</a>, an extremely fast Python
  24. package resolver and installer, written in Rust</strong>.</p>
  25. <div><div class="md:hidden"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 422 250"><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-frame uv-warm-vertical-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90 0Z"></path><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-scope uv-warm-vertical-benchmark_svg__cell" aria-roledescription="group mark container"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90 0h300v90H90Z"></path><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5 90.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-rule uv-warm-vertical-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M90.5 90.5V.5M176.5 90.5V.5M261.5 90.5V.5M347.5 90.5V.5"></path></g></g><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.0 to 3.5"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5 90.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-rule uv-warm-vertical-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M347.5 90.5"></path></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(90.5 105.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0s
  26. </text><text text-anchor="middle" transform="translate(176.214 105.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">1s
  27. </text><text text-anchor="middle" transform="translate(261.929 105.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">2s
  28. </text><text text-anchor="middle" transform="translate(347.643 105.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">3s
  29. </text></g></g><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 4 values: uv, poetry, pip-compile, pdm"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(80.5 15.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel" font-weight="bold">uv
  30. </text><text text-anchor="end" transform="translate(80.5 37.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">poetry
  31. </text><text text-anchor="end" transform="translate(80.5 60.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">pip-compile
  32. </text><text text-anchor="end" transform="translate(80.5 82.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">pdm
  33. </text></g></g><g class="uv-warm-vertical-benchmark_svg__mark-rect uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0134756369786; tool: uv" aria-roledescription="bar" d="M90 4.75h1.155v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.60278702674; tool: poetry" aria-roledescription="bar" d="M90 27.25h51.667v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.55616658094; tool: pip-compile" aria-roledescription="bar" d="M90 49.75h133.386v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 3.37404433084; tool: pdm" aria-roledescription="bar" d="M90 72.25h289.204v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.60278702674; tool: poetry; timeFormat: 0.60s" aria-roledescription="text mark" transform="translate(147.667 37.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0.60s
  34. </text><text aria-label="Sum of time: 1.55616658094; tool: pip-compile; timeFormat: 1.56s" aria-roledescription="text mark" transform="translate(229.386 60.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">1.56s
  35. </text><text aria-label="Sum of time: 3.37404433084; tool: pdm; timeFormat: 3.37s" aria-roledescription="text mark" transform="translate(385.204 82.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">3.37s
  36. </text></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0134756369786; tool: uv; timeFormat: 0.01s" aria-roledescription="text mark" transform="translate(97.155 15.25)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0.01s
  37. </text></g><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90 143h300v90H90Z"></path><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5 233.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-rule uv-warm-vertical-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M90.5 233.5v-90M210.5 233.5v-90M330.5 233.5v-90"></path></g></g><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0 to 5"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5 233.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-rule uv-warm-vertical-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M330.5 233.5"></path></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(90.5 248.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0s
  38. </text><text text-anchor="middle" transform="translate(210.5 248.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">2s
  39. </text><text text-anchor="middle" transform="translate(330.5 248.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">4s
  40. </text></g></g><g class="uv-warm-vertical-benchmark_svg__mark-group uv-warm-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 4 values: uv, poetry, pdm, pip-sync"><path class="uv-warm-vertical-benchmark_svg__background" aria-hidden="true" d="M90.5 143.5Z" pointer-events="none"></path><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(80.5 158.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel" font-weight="bold">uv
  41. </text><text text-anchor="end" transform="translate(80.5 180.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">poetry
  42. </text><text text-anchor="end" transform="translate(80.5 203.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">pdm
  43. </text><text text-anchor="end" transform="translate(80.5 225.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">pip-sync
  44. </text></g></g><g class="uv-warm-vertical-benchmark_svg__mark-rect uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0576289908; tool: uv" aria-roledescription="bar" d="M90 147.75h3.458v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.9872183659; tool: poetry" aria-roledescription="bar" d="M90 170.25h59.233v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.8969612492; tool: pdm" aria-roledescription="bar" d="M90 192.75h113.818v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 4.6313483826; tool: pip-sync" aria-roledescription="bar" d="M90 215.25h277.88v13H90Z" class="uv-warm-vertical-benchmark_svg__benchmarkBar"></path></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.9872183659; tool: poetry; timeFormat: 0.99s" aria-roledescription="text mark" transform="translate(155.233 180.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0.99s
  45. </text><text aria-label="Sum of time: 1.8969612492; tool: pdm; timeFormat: 1.90s" aria-roledescription="text mark" transform="translate(209.818 203.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">1.90s
  46. </text><text aria-label="Sum of time: 4.6313483826; tool: pip-sync; timeFormat: 4.63s" aria-roledescription="text mark" transform="translate(373.88 225.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">4.63s
  47. </text></g><g class="uv-warm-vertical-benchmark_svg__mark-text uv-warm-vertical-benchmark_svg__role-mark uv-warm-vertical-benchmark_svg__child_layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0576289908; tool: uv; timeFormat: 0.06s" aria-roledescription="text mark" transform="translate(99.458 158.25)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-warm-vertical-benchmark_svg__benchmarkLabel">0.06s
  48. </text></g></g></g></svg></div><div class="hidden md:block"><div class="flex flex-col items-center text-flare md:flex-row md:justify-center"><div class="w-full md:w-[484px]"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 454 139"><g class="uv-resolve-warm-benchmark_svg__mark-group uv-resolve-warm-benchmark_svg__role-frame uv-resolve-warm-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-resolve-warm-benchmark_svg__background" aria-hidden="true" d="M106 16h300v90H106Z"></path><g class="uv-resolve-warm-benchmark_svg__mark-group uv-resolve-warm-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-resolve-warm-benchmark_svg__background" aria-hidden="true" d="M106.5 106.5Z" pointer-events="none"></path><g class="uv-resolve-warm-benchmark_svg__mark-rule uv-resolve-warm-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M106.5 106.5v-90M192.5 106.5v-90M277.5 106.5v-90M363.5 106.5v-90"></path></g></g><g class="uv-resolve-warm-benchmark_svg__mark-group uv-resolve-warm-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.0 to 3.5"><path class="uv-resolve-warm-benchmark_svg__background" aria-hidden="true" d="M106.5 106.5Z" pointer-events="none"></path><g class="uv-resolve-warm-benchmark_svg__mark-rule uv-resolve-warm-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M363.5 106.5"></path></g><g class="uv-resolve-warm-benchmark_svg__mark-text uv-resolve-warm-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(106.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">0s
  49. </text><text text-anchor="middle" transform="translate(192.214 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">1s
  50. </text><text text-anchor="middle" transform="translate(277.929 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">2s
  51. </text><text text-anchor="middle" transform="translate(363.643 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">3s
  52. </text></g></g><g class="uv-resolve-warm-benchmark_svg__mark-group uv-resolve-warm-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 4 values: uv, poetry, pip-compile, pdm"><path class="uv-resolve-warm-benchmark_svg__background" aria-hidden="true" d="M106.5 16.5Z" pointer-events="none"></path><g class="uv-resolve-warm-benchmark_svg__mark-text uv-resolve-warm-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(96.5 31.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel" font-weight="bold">uv
  53. </text><text text-anchor="end" transform="translate(96.5 53.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">poetry
  54. </text><text text-anchor="end" transform="translate(96.5 76.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">pip-compile
  55. </text><text text-anchor="end" transform="translate(96.5 98.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">pdm
  56. </text></g></g><g class="uv-resolve-warm-benchmark_svg__mark-rect uv-resolve-warm-benchmark_svg__role-mark uv-resolve-warm-benchmark_svg__layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0134756369786; tool: uv" aria-roledescription="bar" d="M106 20.75h1.155v13H106Z" class="uv-resolve-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.60278702674; tool: poetry" aria-roledescription="bar" d="M106 43.25h51.667v13H106Z" class="uv-resolve-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.55616658094; tool: pip-compile" aria-roledescription="bar" d="M106 65.75h133.386v13H106Z" class="uv-resolve-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 3.37404433084; tool: pdm" aria-roledescription="bar" d="M106 88.25h289.204v13H106Z" class="uv-resolve-warm-benchmark_svg__benchmarkBar"></path></g><g class="uv-resolve-warm-benchmark_svg__mark-text uv-resolve-warm-benchmark_svg__role-mark uv-resolve-warm-benchmark_svg__layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.60278702674; tool: poetry; timeFormat: 0.60s" aria-roledescription="text mark" transform="translate(163.667 53.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">0.60s
  57. </text><text aria-label="Sum of time: 1.55616658094; tool: pip-compile; timeFormat: 1.56s" aria-roledescription="text mark" transform="translate(245.386 76.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">1.56s
  58. </text><text aria-label="Sum of time: 3.37404433084; tool: pdm; timeFormat: 3.37s" aria-roledescription="text mark" transform="translate(401.204 98.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">3.37s
  59. </text></g><g class="uv-resolve-warm-benchmark_svg__mark-text uv-resolve-warm-benchmark_svg__role-mark uv-resolve-warm-benchmark_svg__layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0134756369786; tool: uv; timeFormat: 0.01s" aria-roledescription="text mark" transform="translate(113.155 31.25)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-resolve-warm-benchmark_svg__benchmarkLabel">0.01s
  60. </text></g></g></svg></div><div class="w-full md:w-[484px]"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 454 139"><g class="uv-install-warm-benchmark_svg__mark-group uv-install-warm-benchmark_svg__role-frame uv-install-warm-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-install-warm-benchmark_svg__background" aria-hidden="true" d="M84 16h300v90H84Z"></path><g class="uv-install-warm-benchmark_svg__mark-group uv-install-warm-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-install-warm-benchmark_svg__background" aria-hidden="true" d="M84.5 106.5Z" pointer-events="none"></path><g class="uv-install-warm-benchmark_svg__mark-rule uv-install-warm-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M84.5 106.5v-90M204.5 106.5v-90M324.5 106.5v-90"></path></g></g><g class="uv-install-warm-benchmark_svg__mark-group uv-install-warm-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0 to 5"><path class="uv-install-warm-benchmark_svg__background" aria-hidden="true" d="M84.5 106.5Z" pointer-events="none"></path><g class="uv-install-warm-benchmark_svg__mark-rule uv-install-warm-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M324.5 106.5"></path></g><g class="uv-install-warm-benchmark_svg__mark-text uv-install-warm-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(84.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">0s
  61. </text><text text-anchor="middle" transform="translate(204.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">2s
  62. </text><text text-anchor="middle" transform="translate(324.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">4s
  63. </text></g></g><g class="uv-install-warm-benchmark_svg__mark-group uv-install-warm-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 4 values: uv, poetry, pdm, pip-sync"><path class="uv-install-warm-benchmark_svg__background" aria-hidden="true" d="M84.5 16.5Z" pointer-events="none"></path><g class="uv-install-warm-benchmark_svg__mark-text uv-install-warm-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(74.5 31.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel" font-weight="bold">uv
  64. </text><text text-anchor="end" transform="translate(74.5 53.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">poetry
  65. </text><text text-anchor="end" transform="translate(74.5 76.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">pdm
  66. </text><text text-anchor="end" transform="translate(74.5 98.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">pip-sync
  67. </text></g></g><g class="uv-install-warm-benchmark_svg__mark-rect uv-install-warm-benchmark_svg__role-mark uv-install-warm-benchmark_svg__layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0576289908; tool: uv" aria-roledescription="bar" d="M84 20.75h3.458v13H84Z" class="uv-install-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.9872183659; tool: poetry" aria-roledescription="bar" d="M84 43.25h59.233v13H84Z" class="uv-install-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.8969612492; tool: pdm" aria-roledescription="bar" d="M84 65.75h113.818v13H84Z" class="uv-install-warm-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 4.6313483826; tool: pip-sync" aria-roledescription="bar" d="M84 88.25h277.88v13H84Z" class="uv-install-warm-benchmark_svg__benchmarkBar"></path></g><g class="uv-install-warm-benchmark_svg__mark-text uv-install-warm-benchmark_svg__role-mark uv-install-warm-benchmark_svg__layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.9872183659; tool: poetry; timeFormat: 0.99s" aria-roledescription="text mark" transform="translate(149.233 53.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">0.99s
  68. </text><text aria-label="Sum of time: 1.8969612492; tool: pdm; timeFormat: 1.90s" aria-roledescription="text mark" transform="translate(203.818 76.25)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">1.90s
  69. </text><text aria-label="Sum of time: 4.6313483826; tool: pip-sync; timeFormat: 4.63s" aria-roledescription="text mark" transform="translate(367.88 98.75)" font-family="Roboto Mono,monospace" font-size="12" class="uv-install-warm-benchmark_svg__benchmarkLabel">4.63s
  70. </text></g><g class="uv-install-warm-benchmark_svg__mark-text uv-install-warm-benchmark_svg__role-mark uv-install-warm-benchmark_svg__layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0576289908; tool: uv; timeFormat: 0.06s" aria-roledescription="text mark" transform="translate(93.458 31.25)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-install-warm-benchmark_svg__benchmarkLabel">0.06s
  71. </text></g></g></svg></div></div></div><div class="flex flex-row items-center"><p class="hidden text-sm md:block"><span class="opacity-75">Resolving (left) and installing (right) the <a class="cursor-pointer" target="_blank" rel="noreferrer" href="https://github.com/python-trio/trio">Trio</a> dependencies with a </span><a class="cursor-pointer select-none" aria-label="Toggle cache" tabindex="0" type="button">warm</a> <span class="opacity-75">cache, to simulate recreating a virtual environment or adding a dependency to an existing project (<a href="https://github.com/astral-sh/uv/blob/main/BENCHMARKS.md" target="_blank" rel="noreferrer">source</a>).</span></p><p class="text-sm md:hidden"><span class="opacity-75">Resolving (top) and installing (bottom) the <a class="cursor-pointer" target="_blank" rel="noreferrer" href="https://github.com/python-trio/trio">Trio</a> dependencies with a </span><a class="cursor-pointer select-none" aria-label="Toggle cache" tabindex="0" type="button">warm</a> <span class="opacity-75">cache, to simulate recreating a virtual environment or adding a dependency to an existing project (<a href="https://github.com/astral-sh/uv/blob/main/BENCHMARKS.md" target="_blank" rel="noreferrer">source</a>).</span></p></div></div>
  72. <p><a href="https://github.com/astral-sh/uv">uv</a> is designed as a drop-in replacement for <code>pip</code> and <code>pip-tools</code>,
  73. and is ready for production use today in projects built around those workflows.</p>
  74. <p>Like <a href="https://github.com/astral-sh/ruff">Ruff</a>, uv's implementation was grounded in our core
  75. product principles:</p>
  76. <ol>
  77. <li><strong>An obsessive focus on performance.</strong> In the above <a href="https://github.com/astral-sh/uv/blob/main/BENCHMARKS.md">benchmarks</a>,
  78. uv is <strong>8-10x faster</strong> than <code>pip</code> and <code>pip-tools</code> without caching, and <strong>80-115x faster</strong>
  79. when running with a warm cache (e.g., recreating a virtual environment or updating a dependency).
  80. uv uses a global module cache to avoid re-downloading and re-building dependencies, and
  81. leverages Copy-on-Write and hardlinks on supported filesystems to minimize disk space usage.</li>
  82. <li><strong>Optimized for adoption.</strong> While we have big aspirations for the future of Python packaging,
  83. uv's initial release is centered on supporting the <code>pip</code> and <code>pip-tools</code> APIs behind
  84. our <code>uv pip</code> interface, making it usable by existing projects with zero configuration.
  85. Similarly, uv can be used as "just" a resolver (<code>uv pip compile</code> to lock your
  86. dependencies), "just" a virtual environment creator (<code>uv venv</code>), "just" a package
  87. installer (<code>uv pip sync</code>), and so on. It's both unified and modular.</li>
  88. <li><strong>A simplified toolchain.</strong> uv ships as a single static binary capable of
  89. replacing <code>pip</code>, <code>pip-tools</code>, and <code>virtualenv</code>. uv has no direct Python dependency, so you
  90. can install it separately from Python itself, avoiding the need to manage <code>pip</code> installations
  91. across multiple Python versions (e.g., <code>pip</code> vs. <code>pip3</code> vs. <code>pip3.7</code>).</li>
  92. </ol>
  93. <p>While uv will evolve into a <strong>complete Python project and package manager</strong> (a <a href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html#pillars-of-cargo">"Cargo for Python"</a>),
  94. the narrower <code>pip-tools</code> scope allows us to solve the low-level problems involved in building such
  95. a tool (like package installation) while shipping something immediately useful with minimal barrier
  96. to adoption.</p>
  97. <p>You can install <a href="https://github.com/astral-sh/uv">uv</a> today via our standalone installers,
  98. or from <a href="https://pypi.org/project/uv/">PyPI</a>.</p>
  99. <p><a href="https://github.com/astral-sh/uv">uv</a> supports everything you'd expect from a modern Python
  100. packaging tool: editable installs, Git dependencies, URL dependencies, local dependencies,
  101. constraint files, source distributions, custom indexes, and more, all designed around drop-in
  102. compatibility with your existing tools.</p>
  103. <p><a href="https://github.com/astral-sh/uv">uv</a> supports <strong>Linux</strong>, <strong>Windows</strong>, and <strong>macOS</strong>, and
  104. has been tested at-scale against the public PyPI index.</p>
  105. <h3 class="hover:none group cursor-default"><span id="a-drop-in-compatible-api" class="invisible absolute mt-[-24px] block pt-[24px]"></span>A drop-in compatible API <a href="#a-drop-in-compatible-api" class="hidden group-hover:inline-block">#</a></h3>
  106. <p>This initial release centers on what we refer to as uv's <code>pip</code> API. It'll be familiar to those
  107. that have used <code>pip</code> and <code>pip-tools</code> in the past:</p>
  108. <ul>
  109. <li>Instead of <code>pip install</code>, run <code>uv pip install</code> to install Python dependencies from the command
  110. line, a requirements file, or a <code>pyproject.toml</code>.</li>
  111. <li>Instead of <code>pip-compile</code>, run <code>uv pip compile</code> to generate a locked <code>requirements.txt</code>.</li>
  112. <li>Instead of <code>pip-sync</code>, run <code>uv pip sync</code> to sync a virtual environment with a locked <code>requirements.txt</code>.</li>
  113. </ul>
  114. <p>By scoping these "lower-level" commands under <code>uv pip</code>, we retain space in the CLI for the more
  115. "opinionated" project management API we intend to ship in the future, which will look more like
  116. <a href="https://github.com/mitsuhiko/rye">Rye</a>, or <a href="https://github.com/rust-lang/cargo">Cargo</a>, or
  117. <a href="https://github.com/python-poetry/poetry">Poetry</a>. (Imagine <code>uv run</code>, <code>uv build</code>, and so on.)</p>
  118. <p>uv can also be used as a virtual environment manager via <code>uv venv</code>. It's about 80x
  119. faster than <code>python -m venv</code> and 7x faster than <code>virtualenv</code>, with no dependency on Python.</p>
  120. <div><div class="md:hidden"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 454 282"><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-frame uv-venv-vertical-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107 16Z"></path><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-scope uv-venv-vertical-benchmark_svg__cell" aria-roledescription="group mark container"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107 16h300v90H107Z"></path><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107.5 106.5Z" pointer-events="none"></path><g class="uv-venv-vertical-benchmark_svg__mark-rule uv-venv-vertical-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M107.5 106.5v-90M182.5 106.5v-90M257.5 106.5v-90M332.5 106.5v-90M407.5 106.5v-90"></path></g></g><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.00 to 0.08"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107.5 106.5Z" pointer-events="none"></path><g class="uv-venv-vertical-benchmark_svg__mark-rule uv-venv-vertical-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M407.5 106.5"></path></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(107.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0s
  121. </text><text text-anchor="middle" transform="translate(182.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0.02s
  122. </text><text text-anchor="middle" transform="translate(257.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0.04s
  123. </text><text text-anchor="middle" transform="translate(332.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0.06s
  124. </text><text text-anchor="middle" transform="translate(407.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0.08s
  125. </text></g></g><g class="uv-venv-vertical-benchmark_svg__mark-rect uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0041; tool: uv" aria-roledescription="bar" d="M107 24.5h15.375v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.0744; tool: virtualenv" aria-roledescription="bar" d="M107 54.5h279v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.0241; tool: venv" aria-roledescription="bar" d="M107 84.5h90.375v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0744; tool: virtualenv; timeFormat: 74.4ms" aria-roledescription="text mark" transform="translate(392 65)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">74.4ms
  126. </text><text aria-label="Sum of time: 0.0241; tool: venv; timeFormat: 24.1ms" aria-roledescription="text mark" transform="translate(203.375 95)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">24.1ms
  127. </text></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0041; tool: uv; timeFormat: 4.1ms" aria-roledescription="text mark" transform="translate(128.375 35)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">4.1ms
  128. </text></g><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107 159h300v90H107Z"></path><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107.5 249.5Z" pointer-events="none"></path><g class="uv-venv-vertical-benchmark_svg__mark-rule uv-venv-vertical-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M107.5 249.5v-90M201.5 249.5v-90M295.5 249.5v-90M388.5 249.5v-90"></path></g></g><g class="uv-venv-vertical-benchmark_svg__mark-group uv-venv-vertical-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.0 to 1.6"><path class="uv-venv-vertical-benchmark_svg__background" aria-hidden="true" d="M107.5 249.5Z" pointer-events="none"></path><g class="uv-venv-vertical-benchmark_svg__mark-rule uv-venv-vertical-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M388.5 249.5"></path></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(107.5 264.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0s
  129. </text><text text-anchor="middle" transform="translate(201.25 264.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">0.5s
  130. </text><text text-anchor="middle" transform="translate(295 264.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">1s
  131. </text><text text-anchor="middle" transform="translate(388.75 264.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">1.5s
  132. </text></g></g><g class="uv-venv-vertical-benchmark_svg__mark-rect uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0182; tool: uv" aria-roledescription="bar" d="M107 167.5h3.413v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.1414; tool: virtualenv" aria-roledescription="bar" d="M107 197.5h26.512v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.54; tool: venv" aria-roledescription="bar" d="M107 227.5h288.75v13H107Z" class="uv-venv-vertical-benchmark_svg__benchmarkBar"></path></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.1414; tool: virtualenv; timeFormat: 141.4ms" aria-roledescription="text mark" transform="translate(139.512 208)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">141.4ms
  133. </text><text aria-label="Sum of time: 1.54; tool: venv; timeFormat: 1.54s" aria-roledescription="text mark" transform="translate(401.75 238)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">1.54s
  134. </text></g><g class="uv-venv-vertical-benchmark_svg__mark-text uv-venv-vertical-benchmark_svg__role-mark uv-venv-vertical-benchmark_svg__child_layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0182; tool: uv; timeFormat: 18.2ms" aria-roledescription="text mark" transform="translate(116.412 178)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-venv-vertical-benchmark_svg__benchmarkLabel">18.2ms
  135. </text></g></g></g></svg></div><div class="hidden md:block"><div class="flex flex-row items-center justify-center text-flare"><div class="w-full md:w-[484px]"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 463 139"><g class="uv-venv-seed-benchmark_svg__mark-group uv-venv-seed-benchmark_svg__role-frame uv-venv-seed-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-venv-seed-benchmark_svg__background" aria-hidden="true" d="M99 16h300v90H99Z"></path><g class="uv-venv-seed-benchmark_svg__mark-group uv-venv-seed-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-venv-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 106.5Z" pointer-events="none"></path><g class="uv-venv-seed-benchmark_svg__mark-rule uv-venv-seed-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M99.5 106.5v-90M193.5 106.5v-90M287.5 106.5v-90M380.5 106.5v-90"></path></g></g><g class="uv-venv-seed-benchmark_svg__mark-group uv-venv-seed-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.0 to 1.6"><path class="uv-venv-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 106.5Z" pointer-events="none"></path><g class="uv-venv-seed-benchmark_svg__mark-rule uv-venv-seed-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M380.5 106.5"></path></g><g class="uv-venv-seed-benchmark_svg__mark-text uv-venv-seed-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(99.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  136. 0s
  137. </text><text text-anchor="middle" transform="translate(193.25 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  138. 0.5s
  139. </text><text text-anchor="middle" transform="translate(287 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  140. 1s
  141. </text><text text-anchor="middle" transform="translate(380.75 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  142. 1.5s
  143. </text></g></g><g class="uv-venv-seed-benchmark_svg__mark-group uv-venv-seed-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 3 values: uv, virtualenv, venv"><path class="uv-venv-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 16.5Z" pointer-events="none"></path><g class="uv-venv-seed-benchmark_svg__mark-text uv-venv-seed-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(89.5 35)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel" font-weight="bold">
  144. uv
  145. </text><text text-anchor="end" transform="translate(89.5 65)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  146. virtualenv
  147. </text><text text-anchor="end" transform="translate(89.5 95)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">
  148. venv
  149. </text></g></g><g class="uv-venv-seed-benchmark_svg__mark-rect uv-venv-seed-benchmark_svg__role-mark uv-venv-seed-benchmark_svg__layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0182; tool: uv" aria-roledescription="bar" d="M99 24.5h3.413v13H99Z" class="uv-venv-seed-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.1414; tool: virtualenv" aria-roledescription="bar" d="M99 54.5h26.512v13H99Z" class="uv-venv-seed-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 1.54; tool: venv" aria-roledescription="bar" d="M99 84.5h288.75v13H99Z" class="uv-venv-seed-benchmark_svg__benchmarkBar"></path></g><g class="uv-venv-seed-benchmark_svg__mark-text uv-venv-seed-benchmark_svg__role-mark uv-venv-seed-benchmark_svg__layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.1414; tool: virtualenv; timeFormat: 141.4ms" aria-roledescription="text mark" transform="translate(131.512 65)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">141.4ms
  150. </text><text aria-label="Sum of time: 1.54; tool: venv; timeFormat: 1.54s" aria-roledescription="text mark" transform="translate(393.75 95)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-seed-benchmark_svg__benchmarkLabel">1.54s
  151. </text></g><g class="uv-venv-seed-benchmark_svg__mark-text uv-venv-seed-benchmark_svg__role-mark uv-venv-seed-benchmark_svg__layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0182; tool: uv; timeFormat: 18.2ms" aria-roledescription="text mark" transform="translate(108.412 35)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-venv-seed-benchmark_svg__benchmarkLabel">18.2ms
  152. </text></g></g></svg></div><div class="w-full md:w-[484px]"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 463 139"><g class="uv-venv-no-seed-benchmark_svg__mark-group uv-venv-no-seed-benchmark_svg__role-frame uv-venv-no-seed-benchmark_svg__root" aria-roledescription="group mark container" fill="none" stroke-miterlimit="10"><path class="uv-venv-no-seed-benchmark_svg__background" aria-hidden="true" d="M99 16h300v90H99Z"></path><g class="uv-venv-no-seed-benchmark_svg__mark-group uv-venv-no-seed-benchmark_svg__role-axis" aria-hidden="true"><path class="uv-venv-no-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 106.5Z" pointer-events="none"></path><g class="uv-venv-no-seed-benchmark_svg__mark-rule uv-venv-no-seed-benchmark_svg__role-axis-grid" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M99.5 106.5v-90M174.5 106.5v-90M249.5 106.5v-90M324.5 106.5v-90M399.5 106.5v-90"></path></g></g><g class="uv-venv-no-seed-benchmark_svg__mark-group uv-venv-no-seed-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="X-axis for a linear scale with values from 0.00 to 0.08"><path class="uv-venv-no-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 106.5Z" pointer-events="none"></path><g class="uv-venv-no-seed-benchmark_svg__mark-rule uv-venv-no-seed-benchmark_svg__role-axis-tick" pointer-events="none"><path stroke="rgba(127,127,127,0.25)" d="M399.5 106.5"></path></g><g class="uv-venv-no-seed-benchmark_svg__mark-text uv-venv-no-seed-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="middle" transform="translate(99.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  153. 0s
  154. </text><text text-anchor="middle" transform="translate(174.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  155. 0.02s
  156. </text><text text-anchor="middle" transform="translate(249.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  157. 0.04s
  158. </text><text text-anchor="middle" transform="translate(324.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  159. 0.06s
  160. </text><text text-anchor="middle" transform="translate(399.5 121.5)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  161. 0.08s
  162. </text></g></g><g class="uv-venv-no-seed-benchmark_svg__mark-group uv-venv-no-seed-benchmark_svg__role-axis" aria-roledescription="axis" aria-label="Y-axis for a discrete scale with 3 values: uv, virtualenv, venv"><path class="uv-venv-no-seed-benchmark_svg__background" aria-hidden="true" d="M99.5 16.5Z" pointer-events="none"></path><g class="uv-venv-no-seed-benchmark_svg__mark-text uv-venv-no-seed-benchmark_svg__role-axis-label" pointer-events="none"><text text-anchor="end" transform="translate(89.5 35)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel" font-weight="bold">
  163. uv
  164. </text><text text-anchor="end" transform="translate(89.5 65)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  165. virtualenv
  166. </text><text text-anchor="end" transform="translate(89.5 95)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">
  167. venv
  168. </text></g></g><g class="uv-venv-no-seed-benchmark_svg__mark-rect uv-venv-no-seed-benchmark_svg__role-mark uv-venv-no-seed-benchmark_svg__layer_0_marks" aria-roledescription="rect mark container"><path aria-label="Sum of time: 0.0041; tool: uv" aria-roledescription="bar" d="M99 24.5h15.375v13H99Z" class="uv-venv-no-seed-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.0744; tool: virtualenv" aria-roledescription="bar" d="M99 54.5h279v13H99Z" class="uv-venv-no-seed-benchmark_svg__benchmarkBar"></path><path aria-label="Sum of time: 0.0241; tool: venv" aria-roledescription="bar" d="M99 84.5h90.375v13H99Z" class="uv-venv-no-seed-benchmark_svg__benchmarkBar"></path></g><g class="uv-venv-no-seed-benchmark_svg__mark-text uv-venv-no-seed-benchmark_svg__role-mark uv-venv-no-seed-benchmark_svg__layer_1_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0744; tool: virtualenv; timeFormat: 74.4ms" aria-roledescription="text mark" transform="translate(384 65)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">74.4ms
  169. </text><text aria-label="Sum of time: 0.0241; tool: venv; timeFormat: 24.1ms" aria-roledescription="text mark" transform="translate(195.375 95)" font-family="Roboto Mono,monospace" font-size="12" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">24.1ms
  170. </text></g><g class="uv-venv-no-seed-benchmark_svg__mark-text uv-venv-no-seed-benchmark_svg__role-mark uv-venv-no-seed-benchmark_svg__layer_2_marks" aria-roledescription="text mark container"><text aria-label="Sum of time: 0.0041; tool: uv; timeFormat: 4.1ms" aria-roledescription="text mark" transform="translate(120.375 35)" font-family="Roboto Mono,monospace" font-size="12" font-weight="bold" class="uv-venv-no-seed-benchmark_svg__benchmarkLabel">4.1ms
  171. </text></g></g></svg></div></div></div><div class="flex flex-row items-center opacity-75"><p class="text-sm md:hidden">Creating a virtual environment, with (top) and without (bottom) seed packages like pip and setuptools (<a href="https://github.com/astral-sh/uv/blob/ea13d94c57149a8fc6ebfcef46149252e869269f/scripts/benchmarks/venv.sh" target="_blank" rel="noreferrer">source</a>).</p><p class="hidden text-sm md:block">Creating a virtual environment, with (left) and without (right) seed packages like pip and setuptools (<a href="https://github.com/astral-sh/uv/blob/ea13d94c57149a8fc6ebfcef46149252e869269f/scripts/benchmarks/venv.sh" target="_blank" rel="noreferrer">source</a>).</p></div></div>
  172. <p>uv's virtual environments are standards-compliant and work interchangeably with other tools —
  173. there's no lock-in or customization.</p>
  174. <p>Building our own package management stack from scratch also opened up room for new capabilities.
  175. For example:</p>
  176. <ul>
  177. <li><strong>uv supports alternate resolution strategies.</strong> By default, uv follows the standard
  178. Python dependency resolution strategy of preferring the latest compatible version of each package.
  179. But by passing <code>--resolution=lowest</code>, library authors can test their packages against the lowest-compatible version of their dependencies. (This is similar to Go's
  180. <a href="https://go.dev/ref/mod#minimal-version-selection">Minimal version selection</a>.)</li>
  181. <li><strong>uv allows for resolutions against arbitrary target Python versions.</strong> While <code>pip</code>
  182. and <code>pip-tools</code> always resolve against the currently-installed Python version (generating, e.g., a
  183. Python 3.12-compatible resolution when running under Python 3.12), uv accepts
  184. a <code>--python-version</code> parameter, enabling you to generate, e.g., Python 3.7-compatible resolutions
  185. even when running under newer versions.</li>
  186. <li><strong>uv allows for dependency “overrides”.</strong> uv takes pip's “constraints” concepts a step
  187. further via overrides (<code>-o overrides.txt</code>), which allow the user to guide the resolver by
  188. overriding the declared dependencies of a package. Overrides give the user an escape hatch for
  189. working around erroneous upper bounds and other incorrectly-declared dependencies.</li>
  190. </ul>
  191. <p>In its current form, uv won't be the right fit for all projects. <code>pip</code> is a mature and stable
  192. tool, with extensive support for an extremely wide range of use cases and a focus on compatibility.
  193. While uv supports a large fraction of the <code>pip</code> interface, it lacks support for some of its
  194. legacy features, like <code>.egg</code> distributions.</p>
  195. <p>Similarly, uv does not yet generate a platform-agnostic lockfile. This matches <code>pip-tools</code>, but
  196. differs from Poetry and PDM, making uv a better fit for projects built around the <code>pip</code> and
  197. <code>pip-tools</code> workflows.</p>
  198. <p>For those deep in the packaging ecosystem, uv also includes standards-compliant Rust
  199. implementations of <a href="https://peps.python.org/pep-0440/">PEP 440</a> (version identifiers),
  200. <a href="https://peps.python.org/pep-0508/">PEP 508</a> (dependency specifiers),
  201. <a href="https://peps.python.org/pep-0517/">PEP 517</a> (a build-system independent build frontend),
  202. <a href="https://peps.python.org/pep-0405/">PEP 405</a> (virtual environments), and more.</p>
  203. <h3 class="hover:none group cursor-default"><span id="a-cargo-for-python-uv-and-rye" class="invisible absolute mt-[-24px] block pt-[24px]"></span>A "Cargo for Python": uv and Rye <a href="#a-cargo-for-python-uv-and-rye" class="hidden group-hover:inline-block">#</a></h3>
  204. <p>uv represents an intermediary milestone in our pursuit of a <a href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html#pillars-of-cargo">"Cargo for Python"</a>: a unified Python
  205. package and project manager that is extremely fast, reliable, and easy to use.</p>
  206. <p>Think: a single binary that bootstraps your Python installation and gives you everything you need to
  207. be productive with Python, bundling not only <code>pip</code>, <code>pip-tools</code>, and <code>virtualenv</code>, but also <code>pipx</code>,
  208. <code>tox</code>, <code>poetry</code>, <code>pyenv</code>, <code>ruff</code>, and more.</p>
  209. <p>Python tooling can be a low-confidence experience: it's a significant amount of work to stand up a
  210. new or existing project, and commands fail in confusing ways. In contrast, when working in the Rust
  211. ecosystem, you trust the tools to succeed. The Astral toolchain is about bringing Python from a
  212. low-confidence to a high-confidence experience.</p>
  213. <p>This vision for Python packaging is not far off from that put forward by <a href="https://github.com/mitsuhiko/rye">Rye</a>,
  214. an experimental project and package management tool from <a href="https://github.com/mitsuhiko">Armin Ronacher</a>.</p>
  215. <p>In talking with Armin, it was clear that our visions were closely aligned, but that fulfilling
  216. them would require a significant investment in foundational tooling. For example: building such a
  217. tool requires an extremely fast, end-to-end integrated, cross-platform resolver and installer. <strong>In
  218. uv, we've built that foundational tooling.</strong></p>
  219. <p>We saw this as a rare opportunity to team up, and to avoid fragmenting the Python ecosystem.
  220. <strong>As such, in collaboration with Armin, we're excited to be taking over <a href="https://github.com/mitsuhiko/rye">Rye</a>.</strong>
  221. Our goal is to evolve uv into a production-ready <a href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html#pillars-of-cargo">"Cargo for Python"</a>, and to provide a smooth
  222. migration path from Rye to uv when the time is right.</p>
  223. <p>Until then, we'll be maintaining Rye, migrating it to use uv under-the-hood, and, more
  224. generally, treating it as an experimental testbed for the end-user experience we're building
  225. towards.</p>
  226. <p>While merging projects comes with its own challenges, we're committed to building a single, unified
  227. tool under the Astral banner, and to supporting existing Rye users as we evolve uv into a
  228. suitable and comprehensive successor project.</p>
  229. <h3 class="hover:none group cursor-default"><span id="our-roadmap" class="invisible absolute mt-[-24px] block pt-[24px]"></span>Our Roadmap <a href="#our-roadmap" class="hidden group-hover:inline-block">#</a></h3>
  230. <p>Following this release, our first priority is to support users as they consider <a href="https://github.com/astral-sh/uv">uv</a>,
  231. with a focus on improving compatibility, performance, and stability across platforms.</p>
  232. <p>From there, we'll look towards expanding uv into a complete Python project and package manager:
  233. a single binary that gives you everything you need to be productive with Python.</p>
  234. <p>We have an ambitious roadmap for uv. But even in its current form, I think it will
  235. feel like a very different experience for Python. I hope you'll give it a try.</p>
  236. <h3 class="hover:none group cursor-default"><span id="acknowledgements" class="invisible absolute mt-[-24px] block pt-[24px]"></span>Acknowledgements <a href="#acknowledgements" class="hidden group-hover:inline-block">#</a></h3>
  237. <p>Finally, we'd like to thank all those that contributed directly or indirectly to the development of
  238. uv. Foremost among them are <a href="https://github.com/Eh2406">Jacob Finkelman</a>
  239. and <a href="https://github.com/mpizenberg">Matthieu Pizenberg</a>, the maintainers
  240. of <a href="https://github.com/pubgrub-rs/pubgrub">pubgrub-rs</a>. uv uses PubGrub as its underlying
  241. version solver, and we're grateful to Jacob and Matthieu for the work they put into PubGrub in the
  242. past, and for the way they've engaged with us as collaborators throughout the project.</p>
  243. <p>We'd also like to thank those projects in the packaging space that've inspired us,
  244. especially <a href="https://github.com/rust-lang/cargo">Cargo</a>, along with <a href="https://github.com/oven-sh/bun">Bun</a>, <a href="https://github.com/orogene/orogene">Orogene</a>,
  245. and <a href="https://github.com/pnpm/pnpm">pnpm</a> from the JavaScript ecosystem,
  246. and <a href="https://github.com/njsmith/posy">Posy</a>, <a href="https://github.com/konstin/monotrail-resolve">Monotrail</a>,
  247. and <a href="https://github.com/mitsuhiko/rye">Rye</a> from the Python ecosystem. In particular, thanks
  248. to <a href="https://github.com/mitsuhiko">Armin Ronacher</a> for collaborating with us on this effort.</p>
  249. <p>Finally, we'd like to thank the maintainers of <a href="https://github.com/pypa/pip">pip</a> and the members of
  250. the PyPA more broadly for all the work they do to make Python packaging possible.</p>