数值绘图与符号绘图执行时间对比:timeit结果异常排查
问题分析与解决方案
问题根源
你的timeit测试结果不符合预期,核心原因有两个:
Matplotlib状态累积拖慢数值绘图
每次执行code_num里的plt.plot(x,f(x))时,Matplotlib不会自动清除之前的绘图内容,而是把新线条叠加到当前Axes对象上。执行次数越多,Axes内的元素越多,后续绘图操作就越慢,最终拉高了数值方案的整体耗时。而sympy.plot每次调用都会创建全新的绘图实例(即使show=False),不存在状态累积问题,多次执行的耗时更稳定。冗余重复计算增加额外开销
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
相关产品推荐
相关产品推荐

