通义千问代码能力实测:Qwen3-Coder系列到底有多强?

大家好,这里是程序员晚枫。

阿里云Coding Plan最大的卖点之一,就是通义千问系列的代码能力

尤其是Qwen3-Coder-Next和Qwen3-Coder-Plus,号称专为编程优化。今天我来实测一下,看看它们到底有多强。

一、评测维度说明

我从5个维度测试通义千问的代码能力:

  1. 代码生成质量:生成的代码是否正确、规范
  2. 中文理解能力:对中文注释、需求描述的理解
  3. 算法能力:数据结构和算法题的解答
  4. 代码解释能力:对现有代码的分析和解释
  5. 实际项目能力:复杂业务场景的处理

二、实测对比

测试1:Python数据处理

Prompt:写一个Python函数,读取Excel文件,筛选出某一列大于100的行,并保存为新文件

Qwen3-Coder-Plus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import pandas as pd

def filter_excel_by_column(input_file, output_file, column_name, threshold=100):
"""
读取Excel文件,筛选指定列大于阈值的行

Args:
input_file: 输入Excel文件路径
output_file: 输出Excel文件路径
column_name: 要筛选的列名
threshold: 阈值,默认100

Returns:
int: 筛选后的行数
"""
try:
# 读取Excel文件
df = pd.read_excel(input_file)

# 检查列是否存在
if column_name not in df.columns:
raise ValueError(f"列 '{column_name}' 不存在,可用列:{list(df.columns)}")

# 筛选数据
filtered_df = df[df[column_name] > threshold]

# 保存结果
filtered_df.to_excel(output_file, index=False)

print(f"筛选完成:原始 {len(df)} 行,筛选后 {len(filtered_df)} 行")
return len(filtered_df)

except Exception as e:
print(f"处理出错:{e}")
return 0

# 使用示例
if __name__ == "__main__":
filter_excel_by_column("data.xlsx", "filtered.xlsx", "销售额")

评价

  • ✅ 代码完整,有异常处理
  • ✅ 注释详细,文档字符串规范
  • ✅ 中文注释自然流畅
  • ✅ 考虑了边界情况(列不存在)
  • ✅ 有使用示例

Qwen3.5-Plus

1
2
3
4
5
6
7
import pandas as pd

def filter_excel(input_file, column_name, threshold=100):
df = pd.read_excel(input_file)
filtered = df[df[column_name] > threshold]
filtered.to_excel("output.xlsx", index=False)
return filtered

评价

  • ✅ 代码简洁,核心逻辑正确
  • ⚠️ 缺少异常处理
  • ⚠️ 注释较少

测试1结论:Qwen3-Coder-Plus > Qwen3.5-Plus

测试2:算法题解答

Prompt:用Python实现快速排序,要求原地排序,并解释时间复杂度

Qwen3-Coder-Plus

不仅给出了正确的快速排序实现,还:

  • 提供了递归和迭代两种写法
  • 详细分析了时间复杂度(最好O(nlogn)、平均O(nlogn)、最坏O(n²))
  • 讨论了空间复杂度
  • 给出了优化建议(三数取中法、随机化pivot)
  • 附带了完整的测试代码

评价:算法能力确实强,讲解清晰,考虑全面。

Qwen3-Max

代码正确,解释清晰,但优化建议较少。

测试2结论:Qwen3-Coder-Plus > Qwen3-Max

测试3:中文需求理解

Prompt:帮我写一个Python脚本,把文件夹里的所有图片批量压缩,要求保持原格式,压缩后大小不超过500KB

Qwen3-Coder-Plus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
from PIL import Image
import glob

def compress_images(folder_path, max_size_kb=500, quality=85):
"""
批量压缩文件夹中的图片

Args:
folder_path: 图片文件夹路径
max_size_kb: 最大文件大小(KB)
quality: 压缩质量(1-100)
"""
# 支持的图片格式
supported_formats = ('*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff')

image_files = []
for pattern in supported_formats:
image_files.extend(glob.glob(os.path.join(folder_path, pattern)))

print(f"找到 {len(image_files)} 张图片")

for img_path in image_files:
try:
# 获取文件信息
original_size = os.path.getsize(img_path) / 1024 # KB
file_ext = os.path.splitext(img_path)[1].lower()

# 如果已经小于阈值,跳过
if original_size <= max_size_kb:
print(f"跳过(已满足要求): {os.path.basename(img_path)}")
continue

# 打开图片
with Image.open(img_path) as img:
# 转换为RGB(处理RGBA等格式)
if img.mode in ('RGBA', 'LA', 'P'):
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[-1] if img.mode != 'P' else None)
img = background

# 逐步降低质量直到满足大小要求
temp_quality = quality
while temp_quality > 10:
# 保存到临时文件
temp_path = img_path + '.temp'

if file_ext in ('.jpg', '.jpeg'):
img.save(temp_path, 'JPEG', quality=temp_quality, optimize=True)
elif file_ext == '.png':
img.save(temp_path, 'PNG', optimize=True)
else:
img.save(temp_path, quality=temp_quality)

# 检查大小
new_size = os.path.getsize(temp_path) / 1024

if new_size <= max_size_kb:
# 替换原文件
os.replace(temp_path, img_path)
print(f"压缩成功: {os.path.basename(img_path)} "
f"({original_size:.1f}KB -> {new_size:.1f}KB)")
break
else:
os.remove(temp_path)
temp_quality -= 5
else:
print(f"无法压缩到目标大小: {os.path.basename(img_path)}")

except Exception as e:
print(f"处理失败 {os.path.basename(img_path)}: {e}")

# 使用示例
if __name__ == "__main__":
compress_images("./images", max_size_kb=500)

评价

  • ✅ 完整理解了"保持原格式"和"不超过500KB"两个需求
  • ✅ 考虑了多种图片格式
  • ✅ 有智能的压缩策略(逐步降低质量)
  • ✅ 中文注释自然流畅
  • ✅ 有详细的进度输出

测试3结论:中文需求理解能力非常出色

测试4:代码解释

Prompt:解释下面这段代码的作用,并指出潜在问题

1
2
3
4
5
6
def process_data(data):
result = []
for item in data:
if item['status'] == 'active':
result.append(item)
return result

Qwen3-Coder-Plus的回答

代码作用
这段代码的功能是从一个字典列表中筛选出状态为'active'的项,返回一个新的列表。

潜在问题

  1. 空值检查缺失:如果item没有'status'键,会抛出KeyError
  2. 大小写敏感:'active'和'Active'会被视为不同
  3. 性能问题:对于大数据量,使用生成器更高效
  4. 没有输入验证data可能不是列表

改进建议

1
2
3
4
5
6
7
8
9
10
def process_data(data):
if not isinstance(data, list):
raise ValueError("data必须是列表")

for item in data:
if not isinstance(item, dict):
continue
status = item.get('status', '').lower()
if status == 'active':
yield item # 使用生成器更省内存

评价:分析全面,指出的问题都很实际,改进代码质量高。

三、综合评分

维度Qwen3-Coder-PlusQwen3-Coder-NextQwen3.5-PlusQwen3-Max
代码生成⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
中文理解⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
算法能力⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
代码解释⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
项目实战⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

四、使用建议

日常开发

Qwen3-Coder-Plus
理由:代码质量最高,注释规范,适合生产环境。

快速原型

Qwen3-Coder-Next
理由:编程专项优化,响应速度快。

复杂业务

Qwen3-Max
理由:综合能力最强,理解复杂需求更准确。

通用场景

Qwen3.5-Plus
理由:速度快,成本低,日常够用。

五、怎么体验?

阿里云Coding Plan

👉 点击订阅阿里云Coding Plan

一个订阅,通义千问全系列随便用。

六、写在最后

通义千问的代码能力,尤其是Qwen3-Coder系列,确实给了我惊喜。

中文注释自然、代码规范、考虑周全——这些都是国内开发者真正需要的。

国产AI模型,真的站起来了。

说到这儿,插播一个消息。

4月12日,我会在郑州参加腾讯云社区的"龙虾公开课",现场分享《一人公司的AI实战指南》,包括怎么用通义千问这类国产模型提升开发效率。

如果你正好在郑州,欢迎来现场交流。

👉 报名链接:https://mp.weixin.qq.com/s/XQhCrkbumDqtOZXuapMpVg

AI是杠杆,不是对手。

选择权在你手里。


🎁 福利时间

送你一份**《通义千问编程技巧手册》**:

  • 各模型适用场景速查表
  • Prompt优化技巧
  • 实战代码示例

👉 点击免费领取


📚 想系统学习AI编程?

《30讲 · AI编程训练营》 —— 从0到1掌握AI编程实战。


另外,大家去给小明的小红书👇账号点点赞吧~!

【小红书二维码】


【公众号二维码】


🧧 领个红包再走呗~

【红包二维码】


程序员晚枫,专注AI编程培训,法学硕士转行的Python程序员,开源项目 python-office 作者。


🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!


🤖 开发者效率工具推荐

👉 想体验 MiniMax Token Plan点击这里享受 9 折优惠

💡 按次计费,非常划算! 想象成去菜市场买菜——买张门票进去,菜随便拿。按使用次数收费,不限额度,用多少付多少,特别适合开发者!