Python 与Django一起使用Cython。这有意义吗?

Python 与Django一起使用Cython。这有意义吗?,python,django,cython,Python,Django,Cython,使用Cython可以优化Django开发的关键任务应用程序的速度吗 最近我在互联网上读到,Cython可以将Python代码转换为类似C的速度。Django有可能做到这一点吗?嗯,是的,但是大多数web应用程序不会真正从这种变化中受益,除非你有确凿的证据证明它会受益。配置两次,优化一次 是否可以使用Cython优化在Django开发的关键任务应用程序的速度 这是值得怀疑的 web应用程序的大部分响应时间是必须单独下载的非HTML元素。通常的经验法则是每个HTML页面有8个静态文件。(.CSS、.

使用Cython可以优化Django开发的关键任务应用程序的速度吗


最近我在互联网上读到,Cython可以将Python代码转换为类似C的速度。Django有可能做到这一点吗?

嗯,是的,但是大多数web应用程序不会真正从这种变化中受益,除非你有确凿的证据证明它会受益。配置两次,优化一次

是否可以使用Cython优化在Django开发的关键任务应用程序的速度

这是值得怀疑的

web应用程序的大部分响应时间是必须单独下载的非HTML元素。通常的经验法则是每个HTML页面有8个静态文件。(.CSS、.JS、图像等)

因为这些静态内容都不是来自Django,所以web应用程序的大部分时间线都是Apache(或Nginx或Django之外的其他服务器软件)

在查看生成HTML的时间时,您会发现大部分时间都花在等待数据库上(即使是在内存SQLite中,您也会看到数据库往往主导时间轴)

当您通过Apache和数据库快速运行时,然后——只有到那时,您可以考虑Python元素。


底线。不要浪费任何时间让Django和Python运行得更快。

与其他答案相呼应,这不太可能为您带来任何具体的好处,当然,除非您已经描述了一个可以获得某些好处的具体案例

除了这些答案之外,我还想指出一个来自雅虎网络团队的网络优化列表。这些都是在适用于许多网站的领域中经过测量和验证的收益,值得研究:

卓越性能团队已经确定了许多快速制作网页的最佳实践。该清单包括35个最佳实践,分为7类


从概念上讲,你追求的是可能的,但你看错了方向

您真的应该对PyPy感兴趣,这是Django(和Python)社区非常有前途的技术。与普通Python相比,PyPy上的Django基准测试已经显示出12.5倍的速度增益。现在,尽管前端静态资源可能会对最终用户的大部分页面响应做出贡献(根据上面S.Lott的回答),但这并不能解决服务器端的速度提升极其重要的现实问题。Facebook之所以发明HipHop PHP就是因为这个原因……PHP的滞后性根本无法解决这个问题。离家更近,简单地认为MeeBo(Python驱动站点)每月在服务器基础设施上花费数万美元。现在,您可以体验一下使用PyPy节省服务器成本的效果了吗?性感


查看基准测试:

我们构建了一个安装在客户站点上的应用程序,名为,它管理Genesys供电的联系人中心的配置。这是一个用Cython编译的Django应用程序

速度有所提高,但幅度不大。我们每秒需要处理大量请求,而执行此操作的主要延迟是由数据库造成的。最大的收获是数据库调优和良好的sql

您需要有一个非常强烈的需求来做这样的事情,因为它确实会导致持续的问题,它增加了我们的测试要求


某些任务的性能差异可能很大,但并非所有任务都如此。因此,改进将取决于应用程序正在做什么。

这取决于后端是否有繁重的进程。在我的例子中,它可以改进其中一个过程,并将其速度提高约5倍。我有一个函数,可以修改用户输入的大型XML文件,并将输出保存到数据库中。告诉Cython,在某些地方,输入或输出是字符串,这是5x加速魔法。

这在大多数情况下都是正确的,大约95%的情况下,基于django的应用程序大多是CRUD。但是,如果web应用程序引擎需要进行大量计算,而不仅仅是获取数据,则应用过滤器和返回。在这种情况下,python成为了瓶颈,人们可能会考虑优化这个代码库,或者转向更好(但更难)的替代方案。既然您不必提供CSS、JS等服务,它难道不能用于优化Django API吗?这是误导和错误的,尤其是在您不提供资产的情况下(Python不应该在生产应用程序中这样做)。我认为95%的请求时间都花在Python上,其余的时间都花在nginx和路由上。正如@DanielvanFlymen所说,静态资产通常不是作为链接添加的,然后浏览器从静态URL下载它们,nginx/Apache/etc可以在同一台服务器或其他服务器上提供这些服务(CDN)?这意味着Python对于静态资产并不重要,而只是在接收到queryset数据后视图的呈现速度。更快的queryset数据处理和更快的视图呈现=更快的响应时间…PyPy需要大量内存,并且不断增加。目前,我们的一个应用程序从1.5GB的Ram开始,在一天内即可达到3.1如果无法找到泄漏源,请向PyPy开发人员报告您的用例。(请确保您的应用程序本身或滥用基于c的库(如NumPy)不是导致泄漏的原因,并且不会在Cpyton版本的Django中发生。)pypy不是很慢bd访问吗?Instragram使用Django,并且一直在使用Cython优化他们的部分代码库:youtube.com/watch?v=_1MSX7V28Po