You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数值绘图与符号绘图执行时间对比:timeit结果异常排查

问题分析与解决方案

问题根源

你的timeit测试结果不符合预期,核心原因有两个:

  1. Matplotlib状态累积拖慢数值绘图
    每次执行code_num里的plt.plot(x,f(x))时,Matplotlib不会自动清除之前的绘图内容,而是把新线条叠加到当前Axes对象上。执行次数越多,Axes内的元素越多,后续绘图操作就越慢,最终拉高了数值方案的整体耗时。而sympy.plot每次调用都会创建全新的绘图实例(即使show=False),不存在状态累积问题,多次执行的耗时更稳定。

  2. 冗余重复计算增加额外开销
    code_num里的sy.lambdify(t, expression, 'numpy')和x = np.linspace(0,5,100)属于只需执行一次的初始化操作,但你把它们放到了stmt循环体内,导致每次timeit迭代都重复执行这些步骤,额外增加了数值方案的耗时。

修正后的测试代码

将重复初始化的逻辑移到setup中,同时在数值绘图的stmt里重置Matplotlib状态,确保每次测试独立:

import timeit

setup = '''
import numpy as np
import matplotlib.pyplot as plt
import sympy as sy

t = sy.Symbol('t')
expression = sy.exp(t)
# 仅需初始化一次的操作移到setup
f = sy.lambdify(t, expression, 'numpy')
x = np.linspace(0,5,100)
'''

code_sym = '''
sy.plot(expression, xlim=[0,5], ylim=[0,150], show=False)
'''

code_num = '''
# 每次创建新画布,避免状态累积
plt.figure()
plt.plot(x, f(x))
# 关闭画布释放资源
plt.close()
'''

num_exec = 10

time1 = timeit.timeit(stmt=code_sym, setup=setup, number=num_exec)
print('符号绘图耗时:', time1, '秒')

time2 = timeit.timeit(stmt=code_num, setup=setup, number=num_exec)
print('数值绘图耗时:', time2, '秒')

额外优化建议

若要更精准对比绘图性能,可统一两种方案的采样点数量(sympy.plot默认自适应采样,点数可能少于100),通过参数指定:

code_sym = '''
sy.plot(expression, xlim=[0,5], ylim=[0,150], show=False, adaptive=False, nb_of_points=100)
'''

内容的提问来源于stack exchange,提问作者user210089

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:25:22