# -*- coding: utf-8 -*-
__author__ = 'Administrator'
#缓存
"""
对于运行代价很高的函数和方法结果,可以进行缓存,只要:
1:该函数是确定性的,输入相同值,生成结果每次都相同;
2:函数返回值在一定时期内(不确定)持续有用和有效

--------
确定性函数是相同参数将始终返回相同的结果,而不确定性的函数返回结果则可能有变化
"""
#较好的缓存候选者通常是:
"""
来自查询数据库的可调用对象结果
来自呈现静态值(像文件内容,WEB请求或者PDF显示)的可调用对象结果
来自确定性的,执行复杂计算的可调用对象结果
记录具有过期时间的数值全局映射,如WEB对话对象
一些需要经常和快速访问的数据.
"""
#1确定性缓存
#计算平方数函数的例子
import random,timeit
import profile,print_stats
cache={}
def s(n):
    return n*n
@profile('not cache')
def f():
    for i in xrange(100):
        s(random.randint(1,10))
def cache_f(n):
    if n not in cache:
        cache[n]=s(n)
    return cache[n]
@profile('cache')
def c_f():
    n=[random.randint(1,10)for i in range(10)]
    ns=[cache_f(i)for i in n]

print f(),c_f()
print print_stats()
"""
当然,只要与缓存交互的时间比函数花费时间少,缓存就是有效的,如果重新计算该值更快一些,姥就一定要这么做,如果使用不正确,缓存也可能危险的
"""
#例子2
"""
在上一个例子中,使用一个函数的参数做为缓存的键值,就只有当参数可以hash时才有效,当参数就的复杂时,并且不一定可以hash时。必须手工处理它们并且将其转换为用于缓存的唯一键值
"""
def me(a,b,c,d):
    key='cache me :::%s %s %s'%(a,b,c)
    if key not in key:
        print 'caching'
        cache[key]=complex_calculation(a,b,c,d)
    print d
    return  cache[key]
"""
当然,有可能通过这个遍历每个参数以自动创建键值,但是有许多特殊情况,将需要手工计算该键值,这样的行为叫备注,可以使用装饰器来处理
"""
#如下:
cache={}
def get_key(function ,*a,**b):
    key='%s.%s'%(function.__module__,function.__name__)
    hash_args=[str(a1)for a1 in a]
    #当然,只有当V可以hash时才能正常使用
    kv=['%s:%s'%(k,hash(v))for k,v in b.items()]
    return '%s:%s:%s'%(key,hash_args,kv)
def memioze(get_key=get_key,caheck=cache):
    def _m(func):
        def _me(*a,**b):
            key=get_key(func,*a,**b)
        try:
            return caheck[key]
        except KeyError as s:
            caheck[key]=func(*a,**b)
            return value
        return _me
    return _m
@memioze()
def faction1(n):
    return n*n

faction1(4)
print cache
"""
这个装饰器使用了一个可调用 的对象来计算键值,默认的get_key将进行参数的内省,如果关键字不能hash,则出现异常
但是这个函数只用于特殊情况,保存值的映射也可以配置的

觉的方法是计算参数的md5 hash或(sha),但是要知道,这样一个hash是有实际代价的,函数本身比键值计算更快的,缓存才意义
"""
#例子3
import md5
def key1(fuction1,n):
    return  md5.md5(str(n)).hexdigest()
@memioze(key1)
def n(n1):
    return n1**2

------------------

# -*- coding: utf-8 -*-
__author__ = 'Administrator'
#非确定性缓存
"""
对于非确定性函数而言,即使在指定相同输入时,也可能产生不同的输入
缓存持续时间按照数据平均更新时间来设置
"""
#例子
c={}
def m(get_kye=get_key,s=c,arg=0):
    def _m(f):
        def __(*a,**b):
            key=get_kye(f,*a,**b)
            try:
                v1,v2=s[key]
                exp=(arg!=0 and (v1)<time.time())
            except KeyError as s:
                exp=True
            if not exp:
                return v2
            s[key]=time.time(),f(*a,**b)
            return s[key][1]
        return __m
    return _m
#假设有一个显示当前时间的函数,如果不显示秒数,那么可以在30秒的老化其来缓存它,来获得合理精确度缓存值
from datetime import datetime
@m(age=30)
def w_t():
    return datetime.now().strftime('%H:%M')
w_t()
c
"""
当然,缓存作废必须由删除过期键的另一个函数异步实现,以加速m函数,在WEB里面经常出现
-----------
主动式缓冲
有很多缓存策略可以用来加速应用程序
MEMCACHED,如果对缓存要求很高可以使用它(http://www.danga.com/memcached)
,它是unix的,也可以在其他平台和其他语言来驱动它
更多可以请看:(http://pypi.python.org/pypi/Beakey)"""

python高级编程:缓存的更多相关文章

  1. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  2. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  3. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  4. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  5. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  6. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  7. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  8. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  9. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

  10. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

随机推荐

  1. JAVA学习篇--javaweb之Filter具体解释

    在DRP项目中,多次提到了Filter,它攻克了字符集的统一设置以及统一控制简单WebCache,从中我们能够体会到.它给我们带来的优点不不过降低代码量这么简单,它的出现避免了我们每一个页面反复的编写 ...

  2. 戴明PDCA方法

    戴明PDCA方法:即Plan(计划).Do(执行).Check(检查)和Action(处理)的缩写. P(plan)计划: 包括方针和目标的确定以及活动计划的制定; D(do)执行: 执行就是具体运作 ...

  3. [Angular 2] Using Promise to Http

    You can also use Promise for http: So for the service, you need to call toPromise() method: getVehic ...

  4. Hibernate Validation各注解的用法

    Bean Validation 中内置的 constraint @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 ...

  5. 使用Mina框架开发 QQ Android 客户端

    Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步AP ...

  6. 关于MyEclipse查看底层源码出现source not found的问题(MyEclipse、Eclipse配置JAD)

    一.MyEclipse 第一步:      下载jad.exe文件:jad下载地址 eclipse插件:net.sf.jadclipse_版本号.jar下载地址一 net.sf.jadclipse_版 ...

  7. Java线程同步与死锁认识

    讲下自己的认识,算小小的总结吧! synchroized 具有同步线程的功能,它的处理机制类似于给参数里面的对象赋一个标记值,来表明当前状态,当程序里面某个线程执行synchroized里面的代码段时 ...

  8. (转)VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“

    中调试项目遇到错误提示,Visual Studio 2010(或VS2008或VS2005)启动调试的时候,弹出提示信息: 生成下面的模块时,启用了优化或没有调试信息: C:\WINDOWS\Micr ...

  9. jQuery模拟点击A标记

    这个问题弄了半小时没想明白,后来觉得是这样的. 菜单 <li class="menu"><a href="xxx.com" target=&q ...

  10. css技巧之如何实现ul li边框重合

    提到边框重合,我们不妨打开淘宝首页浏览主体分类内容板块瞧瞧---亲,你看到了,正是这个,边框重合.其实我们不难发现,这个效果并不难,只是我们没有真正的动手做过而已,所以不知道怎么做,那么下面就是一个很 ...