Python numpy/matplotlib轴/函数缩放

Python numpy/matplotlib轴/函数缩放,python,python-3.x,numpy,matplotlib,complexity-theory,Python,Python 3.x,Numpy,Matplotlib,Complexity Theory,我是matplotlib&numpy noob,但我试图轻松地绘制/可视化函数的渐进运行时。下面的代码片段将一些要比较的行和一个渐近为O(n^2)的函数绘制成图,但该图并没有表明它是一个O(n^2)函数。我曾玩弄过轴的缩放,但无法改善结果。除了将输入重新缩放10倍外,还有什么方法可以使渐近运行时一目了然 def foo(n): time.sleep(n) time.sleep(n ** 2) if __name__ == '__main__': inputs = np.

我是matplotlib&numpy noob,但我试图轻松地绘制/可视化函数的渐进运行时。下面的代码片段将一些要比较的行和一个渐近为O(n^2)的函数绘制成图,但该图并没有表明它是一个O(n^2)函数。我曾玩弄过轴的缩放,但无法改善结果。除了将输入重新缩放10倍外,还有什么方法可以使渐近运行时一目了然

def foo(n):
    time.sleep(n)
    time.sleep(n ** 2)

if __name__ == '__main__':
    inputs = np.array([])
    times = np.array([])
    for i in range(10):
        inputs = np.append(inputs, [i])
        times = np.append(times, timeit("foo({})".format(i / 10), "from __main__ import foo", number=1))

    pyplot.plot(lin := [i for i in range(10)], lin, label="linear", marker='x')
    pyplot.plot([i for i in range(10)], [i**2 for i in range(10)], label="n**2", marker='.')
    pyplot.plot(inputs, times, label="foo", marker='x')
    pyplot.grid(True)
    pyplot.xlabel("x")
    pyplot.ylabel("y")
    pyplot.legend()
    pyplot.title("Graph")
    pyplot.show()
合成图

更新:双轴方法让我更接近我想要的东西。也许有办法进一步改进

def foo(n):
    time.sleep(n)
    time.sleep(n ** 2)

def linfoo(n):
    time.sleep(n)

if __name__ == '__main__':
    inputs = np.array([])
    foo_times = np.array([])
    linfoo_times = np.array([])
    for i in range(10):
        inputs = np.append(inputs, [i])
        foo_times = np.append(foo_times, timeit("foo({})".format(i / 10), "from __main__ import foo", number=1))
        linfoo_times = np.append(linfoo_times, timeit("linfoo({})".format(i / 10), "from __main__ import linfoo", number=1))

    figure, ax1 = pyplot.subplots()
    ax1.set_xlabel("Input (n)")
    ax1.set_ylabel("Reference")
    ax1.plot([i for i in range(10)], [i**2 for i in range(10)], label="n**2", marker='.')
    ax1.plot(lin := [i for i in range(10)], lin, label="linear", marker='x')
    ax1.legend()

    ax2 = ax1.twinx()
    ax2.set_ylabel("Runtime")
    ax2.plot(inputs, foo_times, label="foo", marker='x', color='tab:green')
    ax2.plot(inputs, linfoo_times, label="linfoo", marker='x', color='tab:purple')
    ax2.legend(loc=1)

    figure.tight_layout()
    pyplot.grid(True)
    pyplot.xlabel("x")
    pyplot.ylabel("y")
    pyplot.title("Graph")
    pyplot.show()

matplotlib将自动重新缩放。只是不要绘制“线性”和“n**2”函数。如果这还不够明显,那么你可能想要拟合你的数据。为什么这会让事情变得更加明显?这就是您要寻找的?将输入重缩放10将使n**2和foo图完全匹配,因为我在调用foo时将输入除以10。但这并不是我想要的,因为它使foo运行时看起来是次线性的(仅在视觉上)