Skip to content

Python 的 PyPy 能追上 Go 的性能吗?

在我们选择用哪种编程语言进行后端开发的时候,Python 和 Go 似乎代表了两种极端:

Python 以人生苦短我用Python的开发效率闻名,却经常因性能被调侃为慢如龟速

Go 则以编译即部署的轻量和高并发性能成为云原生时代的宠儿,却因语法简陋被吐槽开发像搬砖

而 PyPy 的出现,像给 Python 注射了一剂强心针,这个基于 JIT(即时编译)的 Python 解释器,宣称能让 Python 代码运行速度提升 5-10 倍。于是我们难免好奇:有了 PyPy,Python 能在后端开发中追上甚至超越 Go 的性能吗?

今天就用 3 个后端核心场景(高并发 API、数据处理管道、长连接服务)的实测数据,结合底层原理和实战案例,一次性说清这个问题。

后端开发的性能到底指什么?

讨论性能前,得先统一标准。对后端服务而言,性能从来不是单维度的谁跑得更快,而是以下三个核心指标的综合:

  • 吞吐量(QPS):单位时间内能处理的请求数,直接决定服务承载能力;
  • 延迟(P99/P999):极端情况下的响应时间,影响用户体验(比如支付接口的卡顿);
  • 资源效率:相同负载下的 CPU/内存占用,直接关系服务器成本。

我们选择的测试环境:

  • 硬件:2 核 4G 云服务器(模拟中小型后端服务的常见配置);
  • 语言版本:Python 3.11(CPython)、PyPy 7.3.11(对应 Python 3.9)、Go 1.21;
  • 框架:Python 用 FastAPI(异步),Go 用 Gin(高性能框架);
  • 测试工具:wrk(压测 HTTP 服务)、cProfile(Python 性能分析)、pprof(Go 性能分析)。

场景一:高并发 API 服务

后端最常见的场景:实现一个用户信息查询API,接收用户 ID,从 Redis 查缓存,返回 JSON 结果。这是典型的 I/O 密集型任务。

代码实现(核心逻辑)

python
# Python(FastAPI + asyncio + aioredis) from fastapi import FastAPI import aioredis import json app = FastAPI() redis = None @app.on_event("startup") async def startup():     global redis     redis = await aioredis.from_url("redis://localhost") @app.get("/user/{user_id}") async def get_user(user_id: str):     data = await redis.get(f"user:{user_id}")     return json.loads(data) if data else {"error": "not found"}
go
// Go(Gin + redis/go-redis) package main import ( 	"encoding/