python运行后是否会有缓存_Python运行时导入包的缓存问题

最近在看sqlalchemy源码,看到根据模块的字符串作为参数,使用__import__方法动态的导入数据库驱动模块,其实也就是一个类,但是它加了缓存,也就是相同的字符串只需要执行一次动态导入,剩下的直接在缓存里找到并返回。

我疑问的是:源码缓存字典里存的是类工厂函数(我自己的说法,不知正确与否),和直接存类的引用有什么区别?

我使用以下的代码演示:

cache函数直接缓存类的引用,new_cahe缓存的是类的工厂函数

impls = {}

new_impls = {}

class A(object):

def hello(self):

print 'hello A'

def cache(val):

if val in impls:

print 'go cache'

return impls[val]

impls[val] = A

return A

def new_cache(val):

if val in new_impls:

print 'go new cache'

return new_impls[val]()

loader = lambda: A

new_impls[val] = loader

return loader()

以下是我的测试过程,

if __name__ == '__main__':

print id(A) #49555272

a = cache('test')

print impls #{'test': }

print id(a) #49555272

b = cache('test')

print id(b) #49555272

print '-------------------'

a_n = new_cache('wei')

print new_impls #{'wei': at 0x000....>}

print id(a_n) #55259736

c = a_n()

c.hello() #hello A

b_n = new_cache('wei')

print id(b_n) #55259736

d = b_n()

d.hello() #hello A

使用结果给我感觉好像并没与什么区别,不知道这个用法有什么特别用意吗?

如果有知道的,请告诉我为什么这么做,先谢谢了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值