3
3
from operator import add , sub , mul , truediv , getitem
4
4
import time , weakref
5
5
6
+ def lazy (func ):
7
+ new_name = '_lazy_' + func .__name__
8
+ globals ()[new_name ] = func
9
+ func .__name__ = new_name
10
+ func .__module__ = __name__
11
+ lazyfunc = Lazy (func )
12
+ return lazyfunc
13
+
6
14
class Lazy (object ):
7
15
8
16
POOL = None
@@ -14,14 +22,15 @@ class Lazy(object):
14
22
@classmethod
15
23
def set_cores (cls , num ):
16
24
cls .CORES = num
17
- def __init__ (self , operator , remote = True , format = '{0}({1})' ):
25
+ def __init__ (self , operator , remote = True , format = '{0}({1})' , debug = False ):
18
26
self .operator = operator
19
27
self .remote = remote
20
28
self .format = format
21
29
self .func = True
22
30
self .depth = - 1
23
31
self .args = None
24
32
self .waitlock = None
33
+ self .debug = debug
25
34
def call (self , * args ):
26
35
cache_key = (self .operator , args )
27
36
if cache_key in Lazy .CACHES :
@@ -41,6 +50,8 @@ def call(self, *args):
41
50
if i .value is None :
42
51
self .argscount += 1
43
52
i .waitings .append (self )
53
+ if i .debug :
54
+ self .debug = True
44
55
if self .argscount == 0 :
45
56
if self .remote :
46
57
Lazy .JOBS .add (self )
@@ -56,7 +67,7 @@ def setdepth(self, l=0):
56
67
i .setdepth (l + (1 if i .remote else 0 ))
57
68
self .depth = max (self .depth , l )
58
69
def __call__ (self , * args ):
59
- s = Lazy (self .operator , self .remote , self .format )
70
+ s = Lazy (self .operator , self .remote , self .format , self . debug )
60
71
return s .call (* args )
61
72
def __add__ (self , a ):
62
73
return ADD (self , a )
@@ -84,11 +95,16 @@ def __eq__(self, other):
84
95
return self .operator == other .operator and self .args == other .args
85
96
def __hash__ (self ):
86
97
return hash ((self .operator , self .args ))
98
+ def opname (self ):
99
+ if self .operator .__name__ .startswith ('_lazy_' ):
100
+ return self .operator .__name__ [6 :]
101
+ else :
102
+ return self .operator .__name__
87
103
def __str__ (self ):
88
104
if self .func :
89
- return 'Lazy(%s)' % (self .operator . __name__ ,)
105
+ return 'Lazy(%s)' % (self .opname () ,)
90
106
elif self .value is None :
91
- return self .format .format (self .operator . __name__ , ', ' .join (map (str , self .args )), * self .args )
107
+ return self .format .format (self .opname () , ', ' .join (map (str , self .args )), * self .args )
92
108
else :
93
109
return str (self .value )
94
110
def __repr__ (self ):
@@ -99,7 +115,8 @@ def argsfinish(self):
99
115
Lazy .JOBS .add (self )
100
116
def finish (self , value ):
101
117
self .runtime = time .time () - self .startrun
102
- #print(self, '==', value)
118
+ if self .debug :
119
+ print (self , '==' , value )
103
120
self .value = value
104
121
for i in self .waitings [:]:
105
122
i .argsfinish ()
0 commit comments