המאמר יוצא מנקודת הנחה שאתם מכירים פייתון ומנהל חבילות. לא מכירים? התחילו עם הפוסט שלי על pip! הוא יוביל אתכם חזרה לפה.
אני אתן פה קפיצת ראש אל הביצה המהבילה של מנהלי החבילות בפייתון ואכתוב על uv. תחזיקו את עצמכם! זה עוד מנהל חבילות וסביבות של פייתון א-ב-ל אחד שתופס תאוצה משוגעת, מהיר מאד, נוח מאד וגם נכתב מתוך מחשבה להתאים לגרסאות אחרות של מנהלי חבילות (כמו pip) ואפילו אינטרפייס מתאים.
האם כדאי לקחת אותו לסיבוב? כן. הבאזז הוא חזק אבל זו תחושת בטן. אני נעזר בדרך כלל ב״רדאר טכנולוגי״. סוג של חיזוי טכנולוגי שחברות מפעילות ומשחררות ומאפשר לנו להבין אם להשקיע או לבדוק טכנולוגיות מסוימות. uv אכן עלתה על הרדאר ולמשל ברדאר של טיקל, בו אני משתמש, uv מופיעה תחת קטגורית ה״ניסיון״. אז אפשר לנסות, לא?
ההתקנה של uv היא באמת פשוטה גם בחלונות, במק ובלינוקס. יש ל-uv יופי של אתר נאה שמרכז את הדוקומנטציה. כמובן שזה בקוד פתוח ואפשר לבחון אותו בגיטהאב. אם אתם בחלונות, יש שם מדריך להרצת חלונות ב-Powershell, אם אתם במק – אפשר להשתמש ב-brew. בלינוקס מתקינים את סקריפט ההתקנה:
curl -LsSf https://astral.sh/uv/install.sh | sh
פינת האבטחה: זה לא רעיון טוב להתקין סקריפט התקנה ככה סתם. אפשר וצריך לבחון אותו פה:
curl -LsSf https://astral.sh/uv/install.sh | less
או לחלופין, להעתיק את הטקסט עם הפקודה הזו (במק):
curl -LsSf https://astral.sh/uv/install.sh | pbcopy
ואז להדביק ב-LLM שאתם סומכים עליו כדי לוודא שאין שם קוד זדוני.
כך או אחרת, בסוף ההתקנה יש לכם uv. אם תקלידו uv –version תראו מספר. אפשר להתחיל! בגדול, uv עובדת בדיוק כמו פואטרי ו-pipenv ו-pip – יש את הסביבה הוירטואלית וה-venv ובדיוק את אותו הדבר. אין כאן איזה משהו מיוחד.
אם יש לנו פרויקט מאפס, נקליד uv init ויווצר לנו פרויקט. הדבר הראשון שרואים זה שהוא קורה מ-ה-ר. למה? כי uv כתובה ב-rust. שפה שבאמת זה הפורטה שלה, יש תנועה מסיבית של המון כלים מבוססים rust שהם פשוט מהירים בצורה וצאת דופן. כמה מהיר? עשיתי השוואה פשוטה עם קוד שביקשתי מ-LLM אקראי כלשהו לייצר. ביקשתי ממנו ליצור פרויקט מאפס ולהתקין: fastapi requests numpy pandas matplotlib scipy pydantic sqlalchemy uvicorn pytest black flake8 httpx boto3 – שזו ערימה מכובדת של תלויות. עם פואטרי לקח לי 16 שניות אבל עם uv… 4 שניות. ואם עובדים בפרויקט מורכב עם הרבה תלויות החסכון הזה (25 אחוז מהזמן!) שווה המון. בטח ובטח בזמן בילד.

אם מישהו רוצה את הקוד להשוואה – הנה הוא:
#!/bin/bash
DEPENDENCIES="fastapi requests numpy pandas matplotlib scipy pydantic sqlalchemy uvicorn pytest black flake8 httpx boto3"
measure_time() {
{ time -p "$@" > /dev/null 2>&1; } 2>&1 | awk '/real/ {print $2}'
}
# uv benchmark with virtual environment
echo "Installing dependencies with uv..."
uv venv .venv > /dev/null 2>&1
source .venv/bin/activate
uv_time=$(measure_time uv pip install $DEPENDENCIES)
deactivate
rm -rf .venv
echo "uv completed in ${uv_time}s."
# poetry benchmark (timing full install including lock file)
echo "Installing dependencies with poetry..."
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"
poetry init -n > /dev/null 2>&1
poetry_time=$(measure_time poetry add $DEPENDENCIES)
cd - > /dev/null
rm -rf "$TMP_DIR"
echo "poetry completed in ${poetry_time}s."
echo ""
echo "Time comparison (seconds):"
echo "uv: $uv_time"
echo "poetry: $poetry_time"
# Difference calculation using awk
diff=$(awk "BEGIN {printf \"%.3f\", $poetry_time - $uv_time}")
# Handling positive and negative differences
if (( $(echo "$diff < 0" | bc -l) )); then
echo "Poetry was faster by ${diff#-} seconds."
else
echo "uv was faster by $diff seconds."
fi
או קיי, אז איך מתחילים? יש את הממשק פקודות של uv ומי שמכיר פואטרי יסתדר איתו מעולה – חוץ מהקטע של הכניסה ל-shell בפואטרי (עד גרסה 2) הכל די דומה.
פואטרי | uv | |
התקנת חבילה | poetry add | uv add |
הסרת חבילה | poetry remove | uv remove |
סנכרון עם קובץ ה-lock | poetry sync | uv sync |
הרצה של קוד | poetry run | uv run |
בנוגע ל-shell, מפואטרי גרסה 2, הם הוציאו את ה-shell מהפקודות כי… סיבות. סיבות מטופשות לדעתי, אבל סיבות. עכשיו כדי להריץ shell צריך להתקין פלגין בפואטרי. ב-uv גם אין shell. כדי להכנס ל-shell בפואטרי או ב-uv צריך להשתמש ב-source .venv/bin/activate הרגיל כדי להכנס ל-shell ו-deactivate כדי לצאת ממנו.
ומה עם מי שמהגר מ-pip? בשביל זה יש ל-uv ממשר נפרד שנקרא uv pip שמקבל את כל הפקודות של pip איך שהן. אחרי שיצרתי את הסביבה של uv עם uv venv. אני יכול להריץ איזו פקודת pip שארצה באמצעות uv pip. למשל install עם:
uv pip install requests
יש תיעוד שלם על ממשק uv pip אבל בגדול – כל פקודה של pip שאתם משתמשים בה – אפשר להשתמש בה עם uv pip. ההבדל הוא שזה רץ במהירות עצומה לעומת pip. מה ההבדל? עבור הסקריפט מלמעלה – uv רצה ב-4 שניות, אבל pip התקינה את הכל ב-32.580 שניות! שזה הפרש משוגע לגמרי. פה זו דוגמה קטנה ומסכנה, אבל תחשבו על ההבדל בפרויקטים מורכבים – זה יכול להיות עניין ארוך מאד בבילדים. ולא צריך לתפור מחדש את הסקריפטים, כל מה שצריך זה להתקין uv ולרוץ. זה הכל.
סיכום
יש עוד המון פיצ׳רים ל-uv כולל ניהול גרסאות פייתון בדומה ל pyenv. אבל המטרה של הפוסט היא לסקרן ולעניין ולא להיות רשימת מכולת בזמן האחרון יוצאים הרבה כלים מהירים מבוססי rust ו-uv הוא תוספת נפלאה לכלים האלו ובזכות המהירות וגם המחשבה על יציבות של הממשק וההתחשבות גם ב-pip – בהחלט שווה לחשוב עליה ולבדוק אותה.