pyecharts 生成图表太慢原因分析

我有一个批量生成 Word 报告的脚本,其中用到了 pyecharts 来绘制各种图表,pyecharts 底层用 ChromeDriver 去获取 Echarts 生成的图片,但是非常不稳定,经常失败。

经过我的调试,发现 pyecharts 会生成一个中间文件 render.html,render.html 负责调用 Echarts 渲染图表,但是 render.html 在引用 Echarts 时是从 https://assets.pyecharts.org/assets/ 加载的:

<script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

这个域名经常访问超时,所以导致了绘制图表失败。

这域名定义在 pyecharts/globals.py 中:

class _OnlineHost:
    DEFAULT_HOST = "https://assets.pyecharts.org/assets/"
    ...

OnlineHostType = _OnlineHost()
...

class _CurrentConfig:
    ...
    ONLINE_HOST = OnlineHostType.DEFAULT_HOST
    ...

CurrentConfig = _CurrentConfig()

最终所有配置都保存到了 CurrentConfig 对象中,我又在 render/engine.py 里看到导入了 CurrentConfig:

from ..globals import CurrentConfig, NotebookType

正好在绘制图表时也用了 pyecharts.render 里的 make_snapshot 函数,因此为了加速渲染,我把 echarts.min.js 下回来放到了本地的 Web 服务器中,并在脚本中强行修改 ONLINE_HOST:

import pyecharts.render
from pyecharts.render import make_snapshot

pyecharts.render.engine.CurrentConfig.ONLINE_HOST = "http://host:8080/"

这下就不会生成失败了。