2012-04-22 53 views
0

有没有办法使它工作?Python:在lambda函数上使用lru_cache,或者使用其他方式为lambda函数创建缓存

func=i_want_it_to_cache_everything(lambda a,b:a+b) 

有一行做...

UPDATE2:

我想出的解决方案(感谢大家谁回答!)。 但是...有一个有趣的现象:缓存减慢程序?

import functools,datetime,timeit 
@functools.lru_cache(maxsize=50000) 
def euclidean_distance3(p1,p2): 
    return (p1[0]-p2[0])**2+(p1[1]-p2[1])**2+(p1[2]-p2[2])**2+(p1[3]-p2[3])**2 
euclidean_distance=(functools.lru_cache(maxsize=50000)(lambda p1,p2: (p1[0]-p2[0])**2+(p1[1]-p2[1])**2+(p1[2]-p2[2])**2+(p1[3]-p2[3])**2)) 
euclidean_distance2=lambda p1,p2: (p1[0]-p2[0])**2+(p1[1]-p2[1])**2+(p1[2]-p2[2])**2+(p1[3]-p2[3])**2 
print(datetime.datetime.now()) 
def test1(): 
    for z in range(50): 
     for i in range(200): 
      for j in range(200): 
       euclidean_distance((i,i,i,i),(j,j,j,j)); 
def test2(): 
    for z in range(50): 
     for i in range(200): 
      for j in range(200): 
       euclidean_distance2((i,i,i,i),(j,j,j,j)); 
def test3(): 
    for z in range(50): 
     for i in range(200): 
      for j in range(200): 
       euclidean_distance3((i,i,i,i),(j,j,j,j)); 
t1=timeit.Timer(test1) 
print(t1.timeit(1)) 
t2=timeit.Timer(test2) 
print(t2.timeit(1)) 
t3=timeit.Timer(test3) 
print(t3.timeit(1)) 

print(euclidean_distance.cache_info()) 
print(euclidean_distance3.cache_info()) 

输出:

9.989034592910151 
4.936129879313011 
10.528836308312947 
CacheInfo(hits=1960000, misses=40000, maxsize=50000, currsize=40000) 
CacheInfo(hits=1960000, misses=40000, maxsize=50000, currsize=40000) 
+0

为什么它有一条线做? – 2012-04-22 17:41:21

+1

@SimeonVisser为了好玩。 – aaronqli 2012-04-22 17:43:01

+0

看起来不是一个很好的计时方式,你应该使用'timeit'模块。 – jamylak 2012-04-22 18:04:18

回答

2
>>> from functools import lru_cache 
>>> x = lru_cache()(lambda a,b:a+b) 
>>> x(2,3) 
5 
>>> x(4,2) 
6 
>>> x(2,3) 
5 
>>> x.cache_info() 
CacheInfo(hits=1, misses=2, maxsize=100, currsize=2) 
+1

我实际上只是自己制定了相同的解决方案。但它看起来像缓存实际上减慢了程序的速度。请参阅编辑。 – aaronqli 2012-04-22 17:59:45