V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Molita
V2EX  ›  Python

对这个 API 优化的较好方案

  •  
  •   Molita · 2018-10-16 19:38:00 +08:00 · 3198 次点击
    这是一个创建于 1989 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人是一个小白开发。。。

    是这样一个 Flask 接口。

    首先获取微信 access_toekn。

    接下来请求获取微信带参数的小程序码。

    最后从本地读取一系列图片文字之类的静态文件将这些东西合在一张新的图片上(用的 pillow,裁剪、翻转、把图片弄成圆的之类就这些操作)。

    这个接口相应时间基本在 5-8s 之间,老大说不行太慢了,怎么优化一下。

    我试了下,貌似耗时主要在两个图片流的传输过程上?

    有没有比较好的办法呀?求助

    24 条回复    2018-10-17 17:23:01 +08:00
    luozic
        1
    luozic  
       2018-10-16 19:48:39 +08:00 via iPhone
    先通过 profile 把瓶颈找到,你这说得好像? 确定了才好动手优化
    opengps
        2
    opengps  
       2018-10-16 19:58:56 +08:00 via Android
    我有个笨办法,就是在后台代码不同位置打时间日志,记录当前时间,然后不断调整打日志代码位置,把最费时间的那一段代码找出来
    Molita
        3
    Molita  
    OP
       2018-10-16 23:26:01 +08:00
    @luozic 好的,我看下哈
    Molita
        4
    Molita  
    OP
       2018-10-16 23:26:16 +08:00
    @opengps =。= 也是办法哈
    donething
        5
    donething  
       2018-10-17 04:21:53 +08:00
    换个语言能快不少吧。。比如 go
    xuanbg
        6
    xuanbg  
       2018-10-17 07:55:00 +08:00
    如果图片不用马上展示的话,可以异步生成图片
    owenliang
        7
    owenliang  
       2018-10-17 08:42:02 +08:00 via Android
    本地文件能花 5 秒吗。。。
    ebingtel
        8
    ebingtel  
       2018-10-17 08:57:08 +08:00
    @donething IO 问题,go 也快不了多少吧……更何况是 5-8s,语言差异能快到哪里呢
    w516322644
        9
    w516322644  
       2018-10-17 09:28:58 +08:00
    感觉是获得那个微信的小程序码吧,模拟浏览器去下载它。
    guiling
        10
    guiling  
       2018-10-17 09:40:48 +08:00
    是类似制作带二维码的分享卡的功能么,一般做法是后台获取小程序码,保存在服务器,返回前端网络路径,然后前端 canvas 绘制渲染海报样式保存图片。后台一般不做图片处理的,简单的裁切缩放可以交给前端,还能转移服务器压力,我做的小程序都是这样,具体耗时看各个手机性能,但一般都是 2~3s,好点的手机整个过程 1s
    guiling
        11
    guiling  
       2018-10-17 09:42:48 +08:00
    要是给后台处理的话,同时又 100 个处理请求估计就 gg 了
    Molita
        12
    Molita  
    OP
       2018-10-17 11:09:55 +08:00
    @guiling 对,是这个工作。我们前端说 canvas 难画,说有适配性能问题不做。。只能我来做了。。现在就是这样,请求量一上来就没了。
    leafiy
        13
    leafiy  
       2018-10-17 13:23:11 +08:00
    这种需求必定用 canvas 做啊,犹豫什么
    适配问题,如果前端不支持再出个 loader 交给后端,再说了现在还有不支持 canvas 的???
    leafiy
        14
    leafiy  
       2018-10-17 13:24:48 +08:00
    Molita
        15
    Molita  
    OP
       2018-10-17 15:35:05 +08:00
    @luozic

    从 profiler 看还是慢在网络请求和生成图片那了

    Total time: 0.691589 s
    File: upvote_func/upvote_func.py
    Function: generate_upvote_share_image at line 90

    Line # Hits Time Per Hit % Time Line Contents
    ==============================================================
    90 @func_line_time
    91 def generate_upvote_share_image(organizer_id):
    92 1 1509.0 1509.0 0.2 user_info = get_user_info(int(organizer_id), ["user_avatar"])
    93 1 1.0 1.0 0.0 if not user_info:
    94 return
    95 1 1.0 1.0 0.0 user_avatar_link = user_info.get("user_avatar")
    96 1 0.0 0.0 0.0 if not user_avatar_link:
    97 return
    98 1 4.0 4.0 0.0 scene = UPVOTE_SHARE_IMAGE_SCENE.format(organizer_id)
    99 1 0.0 0.0 0.0 mini_program_code_image_io = get_mini_program_code(
    100 1 374455.0 374455.0 54.1 UPVOTE_SHARE_IMAGE_PATH, scene)
    101 1 4.0 4.0 0.0 if not mini_program_code_image_io:
    102 return
    103 1 315615.0 315615.0 45.6 return generate_image(user_avatar_link, mini_program_code_image_io)
    MaZiT
        16
    MaZiT  
       2018-10-17 16:01:16 +08:00
    html2canvas 了解一下?
    guiling
        17
    guiling  
       2018-10-17 16:05:11 +08:00
    @Molita 前端不愿意自己画的话网上有一些开组件的,原生的或者框架的都有
    Molita
        18
    Molita  
    OP
       2018-10-17 16:20:37 +08:00
    那就和老板反映下吧。。转移到前端做
    zhangwugui
        19
    zhangwugui  
       2018-10-17 16:32:02 +08:00
    你这是是朋友圈分享图之类的吧。
    生成小程序码这个接口会慢一点,合成图片这个接口会慢一点,这两个地方有影响;
    我只做过后台的,幸亏量不大,要不然服务器根本顶不住。
    还是前台来做吧。
    zhangwugui
        20
    zhangwugui  
       2018-10-17 16:33:30 +08:00
    不过一般 2-3 秒吧,生成小程序码 1.5s ,合成图片 1.5s.另外小程序码后台存表里,不用每次都请求微信接口。
    zhangwugui
        21
    zhangwugui  
       2018-10-17 16:34:03 +08:00
    合成的图片也可以存表里,或者做缓存,我们是存表里的,因为图片上的内容不是经常发生改变的。
    tao1991123
        22
    tao1991123  
       2018-10-17 16:42:47 +08:00
    @Molita #12 你们前端太水了 canvas 哪来的兼容性问题
    kslr
        23
    kslr  
       2018-10-17 16:57:56 +08:00
    不谈前后端,只是图片拼接,速度有点慢了。
    lihongjie0209
        24
    lihongjie0209  
       2018-10-17 17:23:01 +08:00
    @donething 你把 python 的性能压榨完了就换语言? 不懂的人哪怕换汇编还是一个样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4286 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:13 · PVG 18:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.