登录

  • 登录
  • 忘记密码?点击找回

注册

  • 获取手机验证码 60
  • 注册

找回密码

  • 获取手机验证码60
  • 找回
毕业论文网 > 外文翻译 > 电子信息类 > 电子信息工程 > 正文

基于贪婪策略的Django最优化方法外文翻译资料

 2021-12-11 21:58:08  

2013年第10届 网络信息系统与应用大会

基于贪婪策略的Django最优化方法

摘要

Python上的Django在敏捷Web开发方面做得很好。python是一种动态编程语言,众所周知,它的运行效率很低。问题是它将如何影响Django的效率。本文从内存优化的角度来回答这个问题,通过提高python在内存使用中的效率,我们将看到它将如何影响django。python使用内存池技术管理非容器对象,经过分配和释放操作后,会产生内存碎片,垃圾回收模块很难处理。本文提出了一种新的非容器对象管理贪婪算法,它可以最大限度地降低产生碎片的概率,从而使垃圾收集模块能够及时收集垃圾非容器对象。我们在名为unladen swallow的开源项目的基准上进行了实验。当Django呈现一个模板时,它将节省大约10%的内存,几乎同样的时间消耗。

关键字:Web框架 动态编程语言 最优化 内存池 垃圾收集

I.介绍

Web应用程序开发经历了一个需求巨大的快速发展过程。为了得到客户的反馈和快速的调整,程序员应该具备敏捷开发的能力。Web技术肯定非常成熟,但是用于Web应用程序开发的组件、框架和工具的激增使程序员面临异构性的挑战。基于动态编程语言的Web框架为开发人员带来了一种新的开发范例:如Ruby on Rails和Django on python。这种敏捷的Web框架可以简化Web应用程序的进程。

有各种基于python的web框架,如django、grok、pylons、turbogears、web2py、zope2,它们都是全栈框架。这些全栈框架为程序员开发Web应用程序提供了完整的解决方案,但很少有人关心它们的效率。本文重点讨论了Python的运行时效率如何影响其Web框架的问题。python是一种开发效率很高的动态编程语言,但是运行效率低。一个重要的原因是设计理念,即一切都是对象;PythonVM必须有许多内存分配和类型检查操作。我们试图提高python vm的内存使用效率,看看它如何影响其Web框架。

II.问题描述

python有很多实现,比如cpython、jpython、ironpython。CPython是用C编写的,是原始版本。Jpython运行在Java VM上,Iron Python在.NET上运行。在本文中,我们将python称为cpython的版本2,因为pypi中的大多数项目都是由它开发的。

A.动机示例

无论您使用什么编程语言,整数都可能是最基本的类型。在python vm上运行python程序时,会分配很多整数。以下是一个示例:

gt;gt;gt; for i in range(344,43332):

gt;gt;gt; print i

python vm将首先分配42989个整数,然后打印它们。让我们沮丧的是,python vm永远不会释放这些内存空间。在计算密集型的Python项目中,我们可以预见会出现许多类似但更复杂的情况。

实际上,这种内存管理有一个很大的问题。您经常分配内存,但没有仔细地释放它们。实际上,python-vm解决了这个问题,但并不十分完美,这导致内存使用效率低下,特别是在Web应用程序中。

B. Python的内存管理系统

在Python中,一切都是对象。基本数据类型、高级数据类型、函数、模块、进程的堆栈帧都是对象。有些对象非常小,例如整数对象,有些则稍大,例如函数对象。频繁地

分配和释放对象会增加碎片问题,增加系统性能成本。

python vm的内存管理是基于引用计数的,为了解决循环引用问题,它将所有python对象分为两部分,一部分是容器对象,另一部分是非容器对象。整数对象、浮点对象都是非容器对象;列表对象、帧对象都是容器对象。python vm有一个名为gc的模块,用于解决循环引用问题。此模块将在以下两种情况下触发

  1. 循环引用对象的数量达到了预定义的阈值;
  2. 手动调用

容器对象的管理在碎片和系统性能成本之间取得了良好的平衡。非容器对象的管理要容易得多。由于非容器对象非常常见,所以python vm采用内存轮询技术来处理分配和自由操作。以整数对象为例,其主要结构如图1所示:

图1. 整型对象模型

当一个整数对象变成垃圾时,python vm只将其插入空闲列表的头部。通过连续的内存分配和空闲操作,可用的整数对象将分散在内存池中。将整个块释放回操作系统将非常困难,而且碎片整理也会花费太多的成本。所以python vm占用的内存满足一个简单的规则:

此外,垃圾收集模块将扫描每个块,查看该块中的所有整数对象是否都是垃圾,如果是,它将释放该块。为了实现它,Python的设计者给出了两个假设:一个假设内存足够大;另一个假设是不会有太多的整数。然而,随着python的广泛应用,特别是在科学计算、机器学习、Web应用中,这两种假设都遭到了违背。

总之,python vm在非容器对象管理方面存在以下三个缺陷:

1. 完全依赖于垃圾收集模块。如果循环引用对象的数量未达到阈值,则python vm将永远不会释放该块。

2. 效率低。垃圾收集模块将扫描所有整数对象。

3. 碎片整理很困难。即使触发垃圾收集模块,也只能释放有限的内存,因为整数对象分散在所有块中。

在本文中,解决了这些问题。

III. 方法

  1. 非容器对象管理的贪婪算法

在本节中,我们将介绍一个新的用于Python的非容器对象管理模型。这个模型可以使自己独立于垃圾收集模块。在这个模型中,所有的块都被分为三类,一部分是空的,一部分是完全的;每个类别中的块都由一个链接列表链接:L_empty,L_party,L_fully。整数对象的分配和释放过程由贪婪算法控制。该算法详细描述如下:

a.分配一个对象:

当python vm分配一个整数对象时,它选择的块应该满足以下公式:

如果块中没有可用的整数对象,则应将块完全移入L_。初始化后,L_部分列表应至少保留一个块。

b.释放一个对象:

当释放一个对象时,以下有三种情况:

1. 如果对象所属的块完全在L_中,它将部分移动到L_的头部。

2. 如果对象所属的块部分位于L_中;如果该块已用完,则应将其移至L_Empty,或者将其与下一个链接块保持的编号进行比较,如果较小,则交换它们。

3.收集在L_Empty中的块。

伪代码描述如下:

算法1 分配一个整型

  1. if L_Empty==NULL then
  2. allocate a new _intblock;
  3. return one PyIntObject from _intblock;
  4. else then
  5. if the current_intblockrsquo;s remaining integer objects==1 then
  6. move L_Partly to L_Fully;
  7. L_Partly = L_Partly -gt;next;
  8. return one PyIntObject from L_Partly;

算法2 释放一个整型

  1. find the _intblock this integer belongs to, and assign the _intblockrsquo;s address to current variable
  2. label this PyIntObject as free;
  3. if current belongs to L_Fully then
  4. move this current to the first of L_Partly;
  5. if current belongs to L_Partly then
  6. if current-gt;free_num==N_INTOBJECTS-1 then
  7. move current to L_Empty;
  8. else then
  9. while current-gt;free_numlt;current-gt;next-gt;free_num
  10. exchange(current,current-gt;next);
  11. free all the blocks in L_Empty;
  12. 基于贪婪算法的模型特性

使非容器对象独立于垃圾收集模块;

这种方法是启发式的。由于L_Partly中块的剩余有用整数对象的数量部分保持非升序,因此最常用的块将优先使用。部分L_Partly的尾块将逐渐收集。

图2. L_Partly

IV. 试验

通过实验,我们想回答以下问题:

  1. 贪婪算法有效吗?
  2. 修改后,python vm运行速度会变慢吗?
  3. 这种优化将如何影响用Django编写的Web应用程序?
  4. 实验对象

由于Django的应用最广泛,市场占有率最高,所以我们选择Django作为实验对象。表1显示了几种广泛使用的python web框架之间的项目编号比较

表1. pypi中几种广泛使用的python web框架开源项目的比较。

Django出色的特性也使其与Ruby on Rails竞争。Ben Askins和Alan Green对Django和Ruby on Rails进行了详细的比较。两个熟练的程序员使用这两个不同的Web框架实现相同的功能。他们的研究表明,Django使用的代码行更少,花费的时间更少。Django还拥有更简洁的模板系统,能够自动生成管理页面。因此,Django在敏捷Web开发方面具有竞争力。在中国,最成功的案例是豆瓣,现在它拥有近1亿用户。

  1. 实验回顾

我们使用了一台CPU为1.86GHz的PC,Ubuntu内核版本为2.6.28。我们改进了unladen-swallow的开源项目基准。然后比较两种不同的页面呈现方式:render和httpresponse(),render和template.render()。httpResponse()用于呈现一个4M页面和模板。render()用于呈现用django的模板语言编写的150*150表。

为了同时获得python vm的内存使用情况比较,我们编写了一个扩展模块,用于获取内存使用情况。我们在呈现表达式之前和之后制作工具,然后重复100次。

  1. 实验结果

物理内存的使用可以通过读取smaps文件获得,该文件是2.6版本内核中的一个新字符。每次运行基准测试时,都会记录准确的内存使用数据。unladen-swallow通过不同的方式监控记忆。它将从开始到结束随机抽取内存使用情况。下图显示了详细的数据比较。红线代表初始值,蓝色代表修改后的值。

图3. 通过make工具httpresponse()的内存使用

图4. 通过make工具Template.render()的内存使用

图5. 通过随机采样httpresponse()的内存使用

图6. 通过随机采样Template.render()的内存使用

图7. HttpResponse()的时间成本

图8. Template.render()的时间成本

  1. 试验结果分析

因为物理内存的管理与操作系统紧密相连,所以图4显示了内存使用的波动。图8与以前的优化相比节省了10%的内存。图9和图10证明了几乎没有时间成本。

实验结果成功地回答了前面回答的问题。

  1. 贪婪的策略确实有效。
  2. python虚拟机的时间效率不受影响。
  3. 我们的方法将django的内存使用率提高了10%。

V.结论

本文提出了一种贪婪的内存管理策略,并对python vm整数管理的三个缺陷进行了改进,从而提高了python vm的内存使用效率。我们在python web框架django上进行了实验,节省了大约10%的物理内存。该方法可以与许多其他优化方法兼容,如[5]中提到的优化方法。

基于Stratego转换语言的Django MVC Web框架生成技术

摘要

领域特定语言(Domain Specific Languages,DSL)允许提高抽象级别,提高开发效率,并在领域专家和开发人员之间建立公平的沟通。面向语言的编程(Language-Oriented Programming,LOP)是一种基于DSL结构的新范例,它允许分离正在开发的系统中特定于领域和特定于技术的方面。LOP与模型驱动的体系结构和

资料编号:[5721]

您需要先支付 30元 才能查看全部内容!立即支付

企业微信

Copyright © 2010-2022 毕业论文网 站点地图