兄弟姐妹們,打工人最怕啥?不是代碼寫不出來,是“環境一裝半天、跑起來還慢、上線還踩坑”。我這兩天翻了下 Python 3.14.2(2025-12-05) 的發布信息,心里就一個感受:這回官方是真想讓大家少折騰,多干活。 你看它這波更新,別的先不說,光是這幾條就夠咱們茶水間吹一下午:
Free-threaded(可選無GIL):線程終于有機會把多核吃滿,不再是“多線程看著熱鬧、CPU卻在打哈欠”。
標準庫自帶 Zstandard(zstd)壓縮:以前你想要又快又省的壓縮,得裝第三方;現在官方直接塞進來了。
新規矩:3.14 起不再提供 PGP 簽名,官方推薦 Sigstore:說白了就是“驗包方式換了”,別再用老習慣去找 PGP 了。
今天咱不寫論文、不擺架子,直接來個能復制就跑的入門實戰:做一個“壓縮小賣部”接口——后端用 Python 3.14 的 compression.zstd,前端一個 HTML 直接調,最后再給你補一段 鴻蒙 ArkTS 調接口的寫法。你寫完這套,回頭跟同事說一句:“這接口我十分鐘起的”,氣勢立馬不一樣。
?
入門技術
先把話說明白:Python 3.14 的“無GIL”不是默認所有人都自動起飛。它是一個“free-threaded build”(特殊構建),從 Python 3.13 開始就能玩了,3.14 是“官方支持、但仍然可選”的階段。怎么判斷你現在這個 Python 到底是不是那種“能關 GIL 的版本”?官方給了很實在的辦法:python -VV / sys.version 里會出現 free-threading build,還能用 sys._is_gil_enabled() 看進程里 GIL 到底開沒開。另外,你想臨時開/關 GIL,也不是靠玄學——有標準姿勢:
PYTHON_GIL=1 強制開 GIL PYTHON_GIL=0 強制關 GIL(前提:你得是 --disable-gil 那種構建) 或者啟動時用 -X gil=0,1
還有一點特別“人間真實”:free-threaded 不是白嫖,單線程會有點額外開銷;官方文檔說 pyperformance 平均開銷大概在 1%~8%(跟平臺有關)。所以別一上來就喊“我項目必須全換”,先挑你真正 CPU 吃緊的地方上。
主內容
先把環境整利索:用 uv 把“裝環境”這破事兒干脆利落解決
以前新人入門最煩的就是:
“裝 Python → 裝 pip → 裝 venv → 裝依賴 → 版本還對不上 → 人直接麻了”。
現在我強烈建議你試試 uv,它就是那種“少廢話,多辦事”的工具:一個工具把 pip/venv/裝 Python/鎖依賴這些活兒都包了,還主打一個快。
終端里你就這么敲(照抄就行):
# 裝 uv(官方寫法) curl -LsSf https://astral.sh/uv/install.sh | sh # 新建項目 uv init zstd-shop cd zstd-shop # 安裝/切到 Python 3.14(你機器上沒裝也沒事,uv 會管) uv python install 3.14 uv python pin 3.14 # 裝依賴:FastAPI + Uvicorn uv add fastapi "uvicorn[standard]"
上面這些命令,基本就是“給你把地基打好”。uv 官方文檔就這么干的:能初始化項目、加依賴、跑命令、還能裝 Python 版本。
后端開干:用 Python 3.14 自帶 zstd 寫壓縮/解壓 API
Python 3.14 新增的 compression.zstd 模塊,最爽的是:它既有一把梭的 compress/decompress,也有文件接口、流式壓縮這些正經家伙。
注意它屬于“可選模塊”,極少數發行版可能沒編進去;要是你 import 報錯,優先換官方安裝包/正規構建。
在項目根目錄新建 app.py,直接貼:
from __future__ import annotations
import base64
import os
import sys
import time
from concurrent.futures import ThreadPoolExecutor
from fastapi import FastAPI
from pydantic import BaseModel
# Python 3.14 新東西:標準庫自帶 zstd
from compression import zstd # 需要 Python 3.14+
app = FastAPI(title="Zstd Shop (Python 3.14)")
class CompressIn(BaseModel):
text: str
level: int | None = 3 # 壓縮等級:越大越省空間但越慢;3 先夠用
class DecompressIn(BaseModel):
b64: str
@app.get("/ping")
def ping():
return {
"ok": True,
"python": sys.version,
# 有 free-threaded build 才可能關 GIL;普通 Python 這里永遠是 True
"gil_enabled": getattr(sys, "_is_gil_enabled", lambda: True)(),
}
@app.post("/compress")
def compress_api(payload: CompressIn):
raw = payload.text.encode("utf-8")
compressed = zstd.compress(raw, level=payload.level)
b64 = base64.b64encode(compressed).decode("ascii")
ratio = (len(compressed) / len(raw)) if raw else 0.0
return {
"bytes_in": len(raw),
"bytes_out": len(compressed),
"ratio": round(ratio, 4),
"b64": b64,
}
@app.post("/decompress")
def decompress_api(payload: DecompressIn):
compressed = base64.b64decode(payload.b64.encode("ascii"))
raw = zstd.decompress(compressed)
return {"text": raw.decode("utf-8", errors="replace")}
# 純 Python CPU 壓力測試:看看線程到底能不能真并行(free-threaded 才會明顯)
def cpu_burn(iters: int) -> int:
x = 0
for i in range(iters):
x ^= (i * 2654435761) & 0xFFFFFFFF
x = ((x << 13) | (x >> 19)) & 0xFFFFFFFF
return x
@app.get("/bench")
def bench(workers: int = 4, iters: int = 25_000_00):
start = time.perf_counter()
with ThreadPoolExecutor(max_workers=workers) as ex:
results = list(ex.map(cpu_burn, [iters] * workers))
cost = time.perf_counter() - start
return {
"workers": workers,
"iters_per_worker": iters,
"seconds": round(cost, 4),
"checksum": sum(results) & 0xFFFFFFFF,
"gil_enabled": getattr(sys, "_is_gil_enabled", lambda: True)(),
"cpu_count": os.cpu_count(),
"python": sys.version,
}
你看這代碼,就干三件事:
“能壓就壓、能解就解、順手給你一個 bench 看看線程有沒有真跑起來”。
啟動服務:
uv run uvicorn app:app --reload --host 0.0.0.0 --port 8000
瀏覽器打開 http://127.0.0.1:8000/docs,FastAPI 自帶的接口文檔就出來了。

這就是我喜歡 FastAPI 的地方:新手也能“像樣兒”。
端一口氣接上:一個 HTML 就能把接口玩起來
同目錄新建 index.html,內容如下(不搞框架,先求能跑):
<!doctype html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<title>Zstd Shop Demo</title>
</head>
<body>
<h2>壓縮小賣部(Python 3.14 zstd)</h2>
<p>隨便粘一段文字進去,點壓縮,看體積能省多少。</p>
<textarea id="txt" style="width: 100%; ">打工人記住:工具選對,效率翻倍。</textarea>
<div style="margin: 10px 0;">
<button id="btnC">壓縮</button>
<button id="btnD">解壓</button>
<button id="btnB">跑個并發 bench</button>
</div>
<pre id="out" style="background:#f6f6f6;padding:10px;"></pre>
<script>
const out = (x) => (document.getElementById("out").textContent = typeof x === "string" ? x : JSON.stringify(x, null, 2));
let lastB64 = "";
document.getElementById("btnC").onclick = async () => {
const text = document.getElementById("txt").value;
const res = await fetch("http://127.0.0.1:8000/compress", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text, level: 3 }),
});
const data = await res.json();
lastB64 = data.b64;
out(data);
};
document.getElementById("btnD").onclick = async () => {
if (!lastB64) return out("你先壓縮一次,別急。");
const res = await fetch("http://127.0.0.1:8000/decompress", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ b64: lastB64 }),
});
const data = await res.json();
out(data);
};
document.getElementById("btnB").onclick = async () => {
const res = await fetch("http://127.0.0.1:8000/bench?workers=4&iters=25000000");
const data = await res.json();
out(data);
};
</script>
</body>
</html>

打開這個 HTML,你就能在本地把“壓縮/解壓/并發測試”全跑一遍。
這就是前端的爽:接口通了,啥端都能接。
鴻蒙 ArkTS 也能調:后端接口通用才是王道
很多人做鴻蒙卡在“網絡請求怎么寫”。其實鴻蒙的 HTTP 請求模塊也挺直接:創建一個 httpRequest,然后 request(url, options) 發出去。給你一段“能看懂、能改”的 ArkTS 示例思路(把 URL 換成你電腦 IP + 端口就行):
import { http } from '@kit.NetworkKit';
async function compressOnHarmony(text: string) {
let httpRequest = http.createHttp();
const url = "http://YOUR_PC_IP:8000/compress";
const resp = await httpRequest.request(url, {
method: http.RequestMethod.POST,
header: { 'Content-Type': 'application/json' },
expectDataType: http.HttpDataType.STRING,
extraData: JSON.stringify({ text, level: 3 }),
});
// 返回是字符串就 JSON.parse 一下
const body = JSON.parse(resp.result as string);
return body; // { bytes_in, bytes_out, ratio, b64 }
}
鴻蒙這套請求參數(method/extraData/expectDataType/header)就是常用那幾個,邏輯跟你寫 fetch/axios 的腦回路是一樣的:把 body 塞進 extraData,服務端按 JSON 解析就行。
最后嘮兩句“人話”
你別看我今天吹得熱鬧,核心就一句:
別老把“學新技術”當成刷題,當成“給自己省事”的買賣。
Python 3.14 這波的意義,不是讓你去背 PEP 編號,是真把一些“以前要靠第三方、靠玄學、靠折騰”的東西,慢慢變成官方正經能力:free-threaded 終于被官方認賬了(但仍然可選),zstd 也進了標準庫,連發布驗包的規矩都說清楚了。
你要是做后端,就把接口寫穩;
你要是做前端/鴻蒙,就把請求接好;
你要是做性能,就拿 /bench 跑一跑,看看你機器的線程到底能不能真并行。
別的先不管,能把活兒干漂亮,就是硬道理。
#Python #Python314 #多線程 #并發編程 #GIL #后端開發 #FastAPI #接口開發 #前端開發 #Web開發 #鴻蒙開發 #ArkTS #程序員成長 #效率工具 #uv工具 #性能優化


