博客
关于我
Python这么慢,为啥大公司还在用?
阅读量:801 次
发布时间: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/

    你可能感兴趣的文章
    pyqt5不显示窗口
    查看>>
    pyqt5任意组件的拖拽问题
    查看>>
    PyQt5信号与槽学习笔记——自定义信号与槽(二)
    查看>>
    PyQt5学习笔记——信号与槽
    查看>>
    PyQt5开发暗黑风格的计时器
    查看>>
    pyqt5教程11:绘制外观
    查看>>
    pyqt5教程12:拖放功能
    查看>>
    pyqt5教程13:客户定制组件
    查看>>
    pyqt5教程6:信号和事件
    查看>>
    PyQt5教程7:布局Layout管理
    查看>>
    pyqt5教程8:对话框
    查看>>
    pyqt5教程9:Widgets组件
    查看>>
    PyQt5教程——组件(7)
    查看>>
    Pytest monkeypatch不适用于导入的函数
    查看>>
    Pytest 命令行报错: Hint: make sure your test modules/packages have valid Python names.
    查看>>
    pytest 的 request fixture:实现个性化测试需求
    查看>>
    Pytest+Allure 接口自动化测试平台开发实战
    查看>>
    pytest+allure使用动态级别,参数化severity
    查看>>
    Pytest+Unittest+Git+Jenkins企业级CICD自动化测试平台建设方案
    查看>>
    Pytest+Yaml 数据驱动测试用例
    查看>>