【问题标题】:Python Jupyter: performance increase of "ipywidget.interactive"Python Jupyter:“ipywidget.interactive”的性能提升
【发布时间】:2021-05-20 09:29:28
【问题描述】:

我在 Jupyter 中使用以下示例代码。它对滑块值的调整的响应相对延迟。如何提高性能?原则上,我不想每次移动其中一个滑块时都重新绘制整个图。然后应该只重绘曲线(但如何重绘?)。

%matplotlib inline
from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np

def f(omega, phi):
    plt.figure()
    t = np.linspace(0, 10, num = 1000)
    y = sin(omega * t + phi)
    plt.plot(t, y)
    plt.ylim(-1, 1)
    plt.show()

interactive_plot = interactive(f, omega=(0.1, 5, 0.1), phi=(0, 5, 0.1))

interactive_plot

【问题讨论】:

  • 我有几个建议,如果它们适合您的用例,我们可以详细讨论它们:) 1) 增加步骤,即 omega=(0.1,5,0.5),所以它不是每 0.1 计算一次,而是 0.5。 2)预先计算所有值(不是一个非常可扩展的解决方案,但如果范围有限,那么它应该可以工作!)
  • @user12758604:谢谢,但是如何将 y 曲线的更新与绘图的其余部分分开?可以发个答案吗?
  • 我尝试做一些优化(将plt.figure()t=np.linspace(0,10,num=1000) 移出def 范围,因为它们只需要在每次调用函数时执行一次。)但效果可以忽略不计。将 plt.show() 更改为 plt.draw() 确实将速度提高了 3 倍 time.time() 措施,但是,我认为它对我们的人眼来说仍然相当缓慢..抱歉!

标签: python jupyter-notebook ipywidgets


【解决方案1】:

一种没有延迟的可能解决方案如下:

%matplotlib widget
import ipywidgets as interactive
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

ax.set_ylim(-1, 1)

t = np.linspace(0, 10, num = 1000)
    
def f(t, omega, phi):
    return np.sin(omega * t + phi)

@interactive.interact(omega=(0.1, 5, 0.1), phi=(0, 5, 0.1))
def update(omega = 1.0, phi = 0):
    [l.remove() for l in ax.lines]
    ax.plot(t, f(t, omega, phi), color='C0')

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多