博客
关于我
Python这么慢,为啥大公司还在用?
阅读量:799 次
发布时间:2023-03-06

本文共 2228 字,大约阅读时间需要 7 分钟。

Instagram 的技术团队在 2017 年 PyCon 上分享了他们如何将 Instagram 的后端环境从 Python 2.7 和 Django 1.3 升级到 Python 3 的历程。这一迁移不仅是为了应对性能问题,更是为了拥抱 Python 3 的新特性。

为什么选择 Python 和 Django

Instagram 的创始人 Kevin Systrom 和 Mike Krieger 都是产品经理,他们在选择技术时注重稳定性和成熟度。Django 在 2010 年的 Facebook 收购 Instagram 后仍然是其后端的核心框架,至今 Instagram 仍然是 Django 的重度用户。尽管用户数量超过 30 亿,Instagram 的后端仍然以 Python 和 Django 为核心,这得益于 Django 的高性能和可扩展性。

Python 语言的优势所在

Instagram 的联合创始人 Mike Krieger 曾表示,Instagram 的用户对技术实现无关,核心是产品功能和用户体验。Python 的简单性和实用性让 Instagram 的开发者能够专注于解决问题,而不是纠结于复杂的编程语言特性。Python 的语法简单,容易上手,同时具有高度的可读性,使得 Instagram 的团队能够快速迭代开发。

进一步优化运行效率

尽管 Python 和 Django 在功能上表现出色,但随着用户数量的快速增长,Instagram 的服务器数量增长率逐渐赶不上用户增长率。为应对这一挑战,Instagram 的工程师采取了以下措施:

  • 开发工具优化:Instagram 开发了专门的性能调优工具,帮助工程师定位和解决性能瓶颈。
  • C/C++ 重写:对一些对性能敏感的组件(如 memcache 访问)使用 C/C++ 进行重写。
  • Cython 利用:Cython 是 Instagram 的另一个性能提升工具,用于优化 Python 部分的执行效率。
  • 异步 IO 探索:Instagram 的工程师正在探索 asyncio 模块的潜力,希望通过异步 IO 提升处理能力。
  • 为什么要升级到 Python 3

    在长达 5 年的时间里,Instagram 的后端环境一直基于 Python 2.7 和 Django 1.3。这一选择得到了 Instagram 的工程师们的广泛支持,因为 Python 2.7 的稳定性和 Django 1.3 的成熟度为他们提供了可靠的开发基础。

    然而,随着时间的推移,Python 2.7 的社区支持逐渐减少,新功能的开发速度也大大放缓。Instagram 的工程师们认识到,如果不升级到 Python 3,Instagram 的技术将被局限在一个逐渐衰落的生态系统中。

    迁移到 Python 3 的过程

    Instagram 的迁移过程并非一帆风顺,面临了诸多技术挑战:

  • Unicode 处理:Python 3 与 Python 2 在 Unicode 处理上有显著差异,许多函数参数的类型在不同版本中表现不同,导致大量代码需要修改。
  • Pickle 不兼容:Python 2 和 Python 3 的 pickle 模块不兼容,Instagram 的 memcache 库因此需要重新设计。
  • 迭代器特性:Python 3 中的迭代器在某些场景下导致意想不到的问题,例如 map 函数返回迭代器而非列表,导致部分代码逻辑失效。
  • 字典顺序问题:Python 3.6 以后字典的顺序特性与之前版本不同,影响了一些依赖字典顺序的配置管理模块。
  • Instagram 的解决方案包括:

  • 帮助函数封装:开发了 ensure_str、ensure_binary 和 ensure_text 等工具,帮助工程师处理不同版本的字符串类型。
  • 单元测试覆盖:在迁移过程中,Instagram 的单元测试覆盖率达到了 95%,确保迁移过程中的代码稳定性。
  • 配置优化:调整了 Django 和 uwsgi 的配置,确保在不同 Python 版本下性能达到最佳。
  • 迁移后效应

    迁移到 Python 3 带来了显著的性能提升:

  • CPU 指令数下降:每次请求产生的 CPU 指令数减少了 12%,这表明代码执行效率得到了改善。
  • 内存使用优化:内存使用率降低了 30%,进一步提升了服务器资源利用率。
  • 功能扩展:Python 3 的新特性(如类型注解)为 Instagram 的代码库注入了新生力量,同时 asyncio 的引入为后续的异步处理开辟了新路径。
  • Instagram 的启示

    Instagram 的 PyCon 演讲揭示了几个关键点:

  • Python + Django 是可行的:即使在高并发场景下,Python 和 Django 仍然能够胜任。
  • 迭代速度至关重要:通过主分支开发和持续部署,Instagram 保持了快速迭代的开发速度。
  • 社区支持至关重要:与 Python 社区的紧密联系为 Instagram 的技术发展提供了强有力的支持。
  • 迁移的关键:对代码库的全面测试、工具辅助和细致的配置优化是成功迁移的关键因素。
  • 总之,Instagram 的经验告诉我们,选择合适的技术栈并对其进行优化,是产品成功的关键。在迁移过程中,保持代码的可读性和可维护性,通过完善的测试和工具支持,才能确保迁移的顺利进行。

    转载地址:http://loafk.baihongyu.com/

    你可能感兴趣的文章
    Proxy源代码分析--谈谈如何学习linux网络编程
    查看>>
    pr录制自己声音杂音很重
    查看>>
    ps ww
    查看>>
    PS —— 制作喷漆人像
    查看>>
    PS —— 制作证件照
    查看>>
    PS —— 精修图像
    查看>>
    PS 图像调整算法——色调分离
    查看>>
    ps 图层混合模式
    查看>>
    PS获取RGB和十六进制的颜色值
    查看>>
    PyTorch 的 10 条顶级知识点
    查看>>
    PS辅助工具Assistor PS
    查看>>
    pt-archiver 归档历史数据及参数详解
    查看>>
    pt-online-schema-change使用详解
    查看>>
    PyTorch 模型性能分析和优化 — 第 2 部分
    查看>>
    PTA L1-011 A-B
    查看>>
    pta l2-1紧急救援(Dijkstra)
    查看>>
    pta求阶乘序列前n项和_学霸整理——求数列的通项公式解法集锦,转化、归纳一文全懂...
    查看>>
    SpringBoot中集成Redis实现对redis中数据的解析和存储
    查看>>
    pthread_create导致的程序崩溃
    查看>>
    ptyhon POSIX
    查看>>