2012-04-22 6 views
0

それを動作させる方法はありますか?Python:lambda関数のlru_cache、またはラムダ関数のキャッシュを作成するための他の方法

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

そしてそれは1行で行う必要があります...

アップデート2:

私は(答えたみんなに感謝を!)ソリューションを考え出しました。 しかし興味深い現象があります。キャッシングはプログラムの速度を落としますか?

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

なぜそれが1行で実行する必要がありますか? –

+1

@SimeonVisser楽しんでください。 – aaronqli

+0

タイミングの良い方法のようには思えないので、 'timeit'モジュールを使うべきです。 – jamylak

答えて

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

関連する問題