GPT-5 vs Claude Opus 4:我花了 $200 做编程对比,结果出乎意料
说实话,写这篇文章之前我挺纠结的。
因为结论可能跟你想的不太一样。
上个月,我手头有个中型项目要重构——一个用了三年的 Flask 后端,大概 8000 行代码,要迁移到 FastAPI。这种活儿,手动改太慢,全交给 AI 又怕翻车。
于是我决定做个实验:同样的任务,分别用 GPT-5 和 Claude Opus 4 来干,看看谁更靠谱。
测试环境
先说下我的测试条件:
- **项目规模**:8247 行 Python 代码,23 个 API 端点
- **任务类型**:Flask → FastAPI 迁移,包括路由改写、依赖注入、异步改造
- **API 版本**:GPT-5 (2025-06-01) vs Claude Opus 4 (2025-05-14)
- **总花费**:GPT-5 花了 $87,Claude Opus 4 花了 $113
对,Claude 更贵。但贵有贵的道理——也有没道理的地方。
第一轮:路由改写
第一个任务是把 Flask 的 @app.route 改成 FastAPI 的 @app.get/post。
GPT-5 的表现:
# GPT-5 生成的代码
@app.get("/api/users/{user_id}")
async def get_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(User).filter(User.id == user_id).first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user嗯,中规中矩。类型注解加了,依赖注入也用了。但是——
它把 user_id 默认当成 int,而我原来的代码里有些 ID 是 UUID。这个细节它没注意到。
Claude Opus 4 的表现:
# Claude Opus 4 生成的代码
@app.get("/api/users/{user_id}")
async def get_user(
user_id: str, # 保持与原 Flask 路由一致
db: AsyncSession = Depends(get_async_db)
):
stmt = select(User).where(User.id == user_id)
result = await db.execute(stmt)
user = result.scalar_one_or_none()
if not user:
raise HTTPException(status_code=404, detail=f"User {user_id} not found")
return user等等,这里我要更正一下——Claude 不仅注意到了 ID 类型,还主动把 SQLAlchemy 改成了异步版本。
绝了。
这一轮,Claude 赢了。
第二轮:错误处理迁移
Flask 的错误处理用的是 @app.errorhandler,FastAPI 用的是异常处理器。
GPT-5:
直接把所有错误处理器改成了 @app.exception_handler,但是——它漏掉了自定义错误码的映射。我原来有个 APIError 基类,里面有 error_code 字段,GPT-5 没处理这个。
翻车了。
Claude Opus 4:
@app.exception_handler(APIError)
async def api_error_handler(request: Request, exc: APIError):
return JSONResponse(
status_code=exc.http_status,
content={
"error": exc.error_code, # 保留了自定义错误码
"message": exc.message,
"details": exc.details
}
)Claude 不仅保留了 error_code,还主动加了 details 字段。
但是——它把 http_status 写成了 status_code,而我原来的代码里用的是 http_status。
大概是...看走眼了吧。
这一轮,平手。各有各的问题。
第三轮:异步改造
这是最复杂的部分。Flask 是同步的,FastAPI 推荐用异步。
GPT-5:
它把所有数据库操作都加了 await,但是——它没改数据库连接池的配置。结果就是,异步代码跑起来比同步还慢。
因为连接池还是同步的,每次 await 都在等锁。
这事儿挺有意思的——GPT-5 知道要加 await,但不知道要改底层配置。
Claude Opus 4:
# Claude 主动改了连接池配置
engine = create_async_engine(
DATABASE_URL,
pool_size=20,
max_overflow=10,
pool_pre_ping=True, # 加了健康检查
echo=False
)Claude 不仅改了连接池,还加了 pool_pre_ping 来防止连接失效。
但是——它把 pool_size 从原来的 5 改成了 20,而我原来的服务器只有 2 核 4G,根本扛不住 20 个连接。
说白了,Claude 有时候会"过度优化"。
这一轮,Claude 赢了,但赢得不完美。
最终结果
| 指标 | GPT-5 | Claude Opus 4 |
|------|-------|---------------|
| 代码正确率 | 78% | 85% |
| 需要手动修改 | 47 处 | 31 处 |
| 生成速度 | 快 2.3 倍 | 基准 |
| Token 消耗 | 少 35% | 基准 |
| 总花费 | $87 | $113 |
我的结论
如果你追求速度和成本,GPT-5 更合适。它生成快,token 消耗少,适合批量处理简单任务。
如果你追求代码质量,Claude Opus 4 更靠谱。它更懂上下文,会主动考虑边界情况,但价格也更贵。
但是——
最靠谱的方案是混着用。
简单任务(路由改写、模板生成)用 GPT-5,复杂任务(异步改造、架构设计)用 Claude Opus 4。
我后来就是这么干的,总成本降到了 $95,代码质量也没掉。
一个意外的发现
测试过程中我发现,两个模型都有个共同的问题:它们都不会主动问你业务逻辑。
比如我有个 API 是"用户积分兑换",里面有复杂的业务规则。两个模型都是直接改代码,完全没问这些规则是什么意思。
结果就是,改完的代码语法对了,但业务逻辑全乱了。
这事儿让我意识到——AI 编程助手再强,也只是工具。你得告诉它业务背景,它才能写出正确的代码。
写在最后
这次测试花了我 $200 和两个周末。
值不值?
挺值的。至少我知道了什么时候该用哪个模型,什么时候该自己上。
如果你也在纠结选哪个模型,我的建议是:
1. 小项目、简单任务:GPT-5,便宜快
2. 大项目、复杂逻辑:Claude Opus 4,质量高
3. 生产环境:混着用,省钱又靠谱
对了,如果你有不同的测试结果,欢迎在评论区分享。我挺好奇其他人的体验是不是跟我一样。
标签:#GPT5 #ClaudeOpus4 #AI编程 #代码对比 #FastAPI迁移
读者评论 5