当前位置: 首页 > news >正文

小企业网站建设哪家便宜泰安网站建设总结

小企业网站建设哪家便宜,泰安网站建设总结,网站建设须知,数据开放网站建设内容任务 你想定义一个固定尺寸的缓存,当它被填满时,新加入的元素会覆盖第一个(最老的)元素。这种数据结构在存储日志和历史信息时非常有用。 解决方案 当缓存填满时,本节解决方案及时地修改了缓存对象,使其从未填满的缓存类变成了…

任务

你想定义一个固定尺寸的缓存,当它被填满时,新加入的元素会覆盖第一个(最老的)元素。这种数据结构在存储日志和历史信息时非常有用。

解决方案

当缓存填满时,本节解决方案及时地修改了缓存对象,使其从未填满的缓存类变成了填满的缓存类:

class RingBuffer(object):"""这是一个未填满的缓存类""" def __init__(self,size_max):self.max = size_maxself.data = [ ]class __Full(object):"""这是一个填满了的缓存类""" def append(self,x):"""加入新的元素覆盖最旧的元素"""self.data[self.cur] = xself.cur = (self.cur+1) % self.maxdef tolist(self):"""以正确的顺序返回元素列表"""return self,data[self.cur:] + self.data[:self.cur]def append(self,x):"""在缓存末尾增加一个元素"""self.data.append(x)if len(self.data) == self.max:self.cur = 0#永久性地将self的类从非满改成满self.__class__ = self.__Fulldef tolist(self):"""返回一个从最旧的到最新的元素的列表"""return self.data
#用法示例
if __name__ == '__main__'x = RingBuffer(5)x.append(1);x.append(2);x.append(3);x.append(4)print x.__class__, x.tolist()x.append(5)print x.__class__, x.tolist()x.append(6)print x.data,x.tolist()x.append(7); x.append(8); x.append(9); x.append(10)print x.data,x.tolist()

讨论

缓存环是有固定大小的缓存。当它被填满时,加入新元素会覆盖掉它持有的最旧的元素。在存储日志和历史信息时缓存环是非常有用数据结构。Python并没有为这种数据结构提供直接支持,但用它构建一个这种结构却轻而易举。本节解决方案专门为元素插入进行了优化。

一个值得注意的设计要点是,这些对象在它们的生命周期中会经历某种不可逆转的状态转变——从未填满的缓存变成填满的缓存(从此时开始它的行为方式也发生了变化),我通过修改 self.__class__ 来完成这个转变。这种方式对经典类和新风格类都同样有效,只要这些旧的或者新的类的对象都拥有相同的槽(但对两个没有槽的新风格类也有效,比如本节的RingBufer和Full类)。注意,和其他语言不同,虽然Full类的实现位于 RingBufer 类的内部,但两者并没有什么特别的联系,这样其实很好,因为我们完全不需要这种联系。

修改类实例在很多语言中会显得很古怪,但在Python中,相比于其他一些随意的、无法逆转的、零散的修改方式,它是一种很好的选择。而且,这样的修改对于所有的类都是可行的。
缓存环(或者叫做有界的队列)是一个很棒的点子,但是总测试缓存环有没有被填满是很低效的操作,我们也可以找到别的办法,但是测试本身就是一件很讨厌的事情。这种讨厌的事情在 Python 世界中是不受欢迎的,虽然用Python 来做这些事并没有什么难度,而且测试还涉及了更多的内存使用。关键就在于当环被填满时,给__class__赋值以改变其行为方式,这也是它效率出众的原因:这种类转换是一次性的操作,所以它不会带来任何性能上的开销。

另一种选择是,我们可以切换实例的两个方法而非整个类,来使它变成填满的状态:

class RingBuffer(object):def __init__(self,size_max):self.max = size_maxself.data=[]def _full_append(self,x):self.data[self.cur] = xself.cur = (self.cur+1) % self.maxdef _full_get(self):return self.data[self.cur:] + self.data[:self.cur]def append(self,x):self.data.append(x)if len(self.data) == self.max:self.cur = 0#Permanently change self's methods from non-full to fullself.appand = self._full_appendself.tolist = self._full_getdef tolist(self):return self.data

这种切换的方式本质上等价于解决方案给出的类切换方式,尽管具体机制不同。当需要成组地切换所有的方法时,类切换的方式可能是最佳的,而方法切换则在需要更细的行为粒度控制的时候更加合适。当需要在新风格类中切换某些特殊方法时,类切换是唯一的办法,这是因为它固有的特殊方法查询是针对类进行的,而不是针对实例的(经典类和新风格类在这个方面截然不同)。

还可以使用其他很多方法来实现缓存环。在Python2.4中,可以考虑从新类型collections.deque 派生一个子类,这个类型提供了“双头队列”,因而从任意一头添加或者删除数据的效率都是相当的:

from collections import deque
class RingBuffer(deque):def __init__(self,size_max):deque.__init__(self)self.size_max = size_maxdef append(self,datum):deque.append(self,datum)if len(self) > self.size_max:self.popleft()def tolist(self):return list(self)

或者,当环处于稳定状态时,为了避免if语句,还可以混用方法切换:

from collections import deque
class RingBuffer(deque):def __init__(self,size_max):deque.__init__(self)self.size_max = size_maxdef _full_append(self,datum):deque.append(self,datum)self.popleft()def append(self,datum):deque.append(self,datum)if len(self) == self.size_max:self.append = self._full_appenddef tolist(self):return list(self)

在最后的这个实现中,我们只需要切换 append 方法(而tolist方法则保持原状),在这里方法切换显得比类切换更方便。

http://www.dtcms.com/a/563095.html

相关文章:

  • 网站建设方案可以乱写吗桂林市有几个区和县
  • 迪庆州建设局网站佛山seo整站优化
  • 房地产网站欣赏wordpress百科网
  • wordpress博客站点wordpress连数据库很慢
  • 郑州网站建设招标变更网站做推广需要备案
  • 自己给网站做支付接口iis 里没有网站
  • 网站建设开发合同模板下载wordpress获取文章浏览次数
  • vf建设银行网站深圳做微信网站公司哪家好
  • 河北廊坊建设银行网站软件界面设计的原则
  • 建一个网站花多少钱伊犁做网站
  • 怎么做网站旺铺装修东莞企业推广网站制作
  • 水果网站 模板如何做高网站的浏览量
  • 福建省建设厅网站投诉网页设计与制作教案模板
  • 旗舰店的网站怎么做wordpress 修改上传路径
  • 4.游戏逆向-pxxx-得到GName偏移
  • 建站费用报价单聊城开发区网络公司排名
  • 搭建一个网站 优帮云应用商店app下载安装
  • 网站建设与优化及覆盖率方案php旅游类网站开发毕业设计
  • 网站建设排名的公司哪家好discuz可以做公司网站
  • 营销型网站标准网页源码用一个域名免费做网站
  • 网站建设制作人员招聘要求小说类网站功能建设
  • 兼职做网站的软件企业建站模板价格
  • 苏州做网站建设公司南通网站设计制作公司
  • wordpress的php.ini沈阳seo建站
  • 网站cms系统企业年金的好处和坏处
  • 茶叶网站模板免费下载青海省城乡和住房建设厅网站
  • 广州营销型网站建设费用免费看片网站
  • 县建设局 协会网站私人订制网站推荐
  • 计算机网络技术是干嘛的网站在线优化
  • 一个人网站运营怎么做网站后台统计代码