如何使用 uv 取代 pip 來改善 Python 專案的開發流程

  1. 關於 uv
  2. 基本安裝與設定
    1. 安裝 uv
    2. 設定 auto complete
  3. 專案初始化
  4. 建立 Python 虛擬環境
  5. 使用 uv 管理 Python 套件與版本
    1. 安裝 Python 套件
    2. 移除 Python 套件
    3. 顯示套件相依性
  6. 執行 Python 程式碼
  7. Tool 功能(例如:程式碼檢查)
  8. 總結
  9. 參考資料

關於 uv

uv 是一個以 Rust 撰寫的 Python 套件管理工具,安裝套件的速度比 pip 還要快 10-100 倍,有部分開源專案的官網文件的安裝步驟也已經預設使用 uv 取代 pip(如下圖的 Prefect),如果是想要在 Docker 中採用 uv 的話可以參考一下我之前寫的 uv + Docker 的教學 文章 。

近期因為 uv 持續推出很多好用的功能,到現在我所有的專案都已經替換成 uv 來開發,不再使用原本的 pip 了,所以這次想要來整理並分享我自己在開發 Python 專案時使用 uv 的流程。


基本安裝與設定

安裝 uv

# For MacOS
brew install uv

# For Windows
powershell -ExecutionPolicy ByPass -c "irm <https://astral.sh/uv/install.ps1> | iex"

其他詳細安裝方式可參考:https://docs.astral.sh/uv/getting-started/installation/#installing-uv

閱讀更多»

雲端架構部署救星!介紹 Terraform 是如何大幅改善雲端基礎建設的建立流程

  1. 過去在建立基礎架構時有許多痛點
  2. Terraform 是什麼?
  3. Terraform 如何運作
  4. Terraform 基本檔案結構
    1. providers.tf
    2. main.tf
      1. BigQuery Dataset
      2. BigQuery Tables
      3. Pub/Sub Topic
      4. Pub/Sub Subscriptions
    3. variables.tf
    4. terraform.tfvars
    5. outputs.tf
  5. 總結
    1. Terraform 注意事項與缺點
    2. Terraform 帶來的好處
  6. 後記
  7. 參考資料

過去在建立基礎架構時有許多痛點

當我們想要在雲端上建立各種服務時,通常都是透過 UI 的方式進行,但當架構越來越複雜,甚至還需要整組搬遷的時候,就會遇到很多困難,例如重新設定後可能剛好忘記 region 是設在哪、這個專案是用哪一個 Docker image,或這台機器的規格到底是幾個 CPU 多少記憶體。

整體來說,傳統建立基礎架構時會遇到以下的痛點

  • UI 操作過程繁雜
  • 大量人工操作,易出錯且難以維持一致性,增加除錯時間
  • 難以自動化,導致部署效率低
  • 無法版本控管、追蹤變更,增加操作風險
  • 無法重複利用,缺乏模組化設計,每次建立的成本都很高

所以我們過去在建立基礎架構時,常常需要花費大量時間與人力,效率太差,甚至可能會有許多都是重複性高的操作,而 Terraform 就是可以解決這些痛點的重要工具。

Terraform 是什麼?

Terraform 是一種「基礎架構即程式碼」工具 (Infrastructure as Code, Iac) ,讓我們使用人類易讀的設定檔中定義雲端和地端資源,並可對這些檔案進行版本控管、可重複使用和分享共用,讓所有基礎架構能在配置和管理上達成一致。

Terraform 如何運作

Terraform 主要是透過 Providers 來跟特定的雲端 API 做溝通,例如 GCP providers, AWS providers 等

在使用 Terraform 時主要有三個步驟:

閱讀更多»

UNION ALL 語法其實有陷阱?介紹 BigQuery 最新的 UNION ALL BY NAME

  1. SQL 中的 UNION ALL 其實有陷阱?
  2. UNION ALL 實際上會造成什麼問題?
  3. BigQuery 新功能 – UNION ALL BY NAME
  4. 總結
  5. 補充資料 – CORRESPONDING 語法
  6. 參考資料

SQL 中的 UNION ALL 其實有陷阱?

在查詢結構化資料庫時,常會使用到一個 SQL 語法:UNION ALL,但其實這個語法背後有一個很大的坑,就是在合併資料時,UNION ALL 其實會按照 SELECT 的順序來合併 (Positional 特性) ,所以當欄位資料型態一樣時,資料就會無視欄位名稱被按照順序合併起來。

按照順序來合併資料是什麼意思呢?
讓我們看一下範例

UNION ALL 實際上會造成什麼問題?

在這個範例中,我們想要讓名稱為 NumberEmoji 分別 UNION 在各自的欄位,由於這些值都是字串型態,所以 UNION ALL 是會成功執行的,但我們會發現結果並不是我們想要的那樣,因為我們的 SQL 中 SELECT 欄位的順序是錯的,UNION ALL 並不會自動幫我們依據欄位名稱去合併,這個問題除了 BigQuery 之外,其他資料庫像是 MySQL 或 PostgreSQL 也會有一樣的情況

BigQuery 新功能 – UNION ALL BY NAME

閱讀更多»

解決 R 程式碼在 VS Code 中格式 Style Lint 的問題

  1. Step 1: 安裝 R extension
  2. Step 2: 新增 .lintr 檔案
    1. .lintr 檔案會出現在你的專案根目錄中
  3. Step 3: 修改 .lintr 檔案
  4. Step 4: 重新開啟 R code
    1. 最終完整 .lintr 檔範例
    2. 所有設定都可以參考官網
  5. 常見問題
    1. 顯示 Malformed config file, ensure it ends in a newline 的錯誤

此篇文章記錄如何解決 R 程式碼在 VS Code 上會顯示一大堆波浪底線的問題(如下圖)


Step 1: 安裝 R extension

第一步一定要先安裝 VS Code 的 R 擴充套件,才會有排版建議和自動 Format 的功能

預設的 R Linter 是一行只能 80 字,很多程式碼底下會出現警告的波浪線條

Step 2: 新增 .lintr 檔案

  1. cmd + p (或 ctrl + p for Windows) 叫出 VS Code 的指令列
  2. 輸入 > R 之後點擊「Create .lintr to the workspace」

(當然你也可選擇直接手動在根目錄新增檔案)

.lintr 檔案會出現在你的專案根目錄中

透過 R extension 預設內容如下,可以把全部先刪掉

Step 3: 修改 .lintr 檔案

閱讀更多»

如何使用 Python 套件管理工具「uv」取代 pip 來加速 Docker Image 的建立

  1. 前言
  2. 什麼是 uv?
  3. uv 的使用方法
    1. 本機
    2. Dockerfile
  4. 實測檔案
    1. Dockerfile Using pip
    2. Dockerfile Using uv
    3. requirements.txt
  5. Linux Ubuntu 上進行 docker build
    1. 使用 pip = 87.6 秒
    2. 使用 uv = 33.3 秒
  6. GCP Cloud Shell 上進行 docker build
    1. 使用 pip = 20.1 秒
    2. 使用 uv = 11.7 秒
  7. 總結

前言

在 Build Docker Image 的時候,通常最花時間的都是安裝套件,為了突破這個效能瓶頸,這次決定嘗試使用 uv 來取代 pip 進行 Python 套件的安裝。

什麼是 uv?

uv 是一個以 Rust 撰寫的 Python 套件管理工具,號稱比 pip 還要快 10-100 倍,國外也有相關實測,像是 Streamlit 在 2024 年 7 月就有發 blog 表示他們用 uv 取代 pip 後速度提升了 55%(如圖 1)。

(2025/05更新)
近期發現開始有開源專案的官網文件也已經預設是使用 uv 來安裝,例如 Prefect(如圖 2)。

之前我也有在本機實測過,確實有非常顯著地提升了效能,而這次我打算將 uv 運用在 Docker 上,讓 Docker image 的建立時間能大幅縮減。

圖 1:Streamlit 用 uv 取代 pip 後速度提升了 55%
圖 2:開源專案 Prefect 的官網也已經預設是使用 uv 來安裝

uv 的使用方法

閱讀更多»