我想节省时间并将对象标记为已修改,因此我编写了一个类并覆盖了它的__setattr__
功能。
import time
class CacheObject(object):
__slots__ = ('modified', 'lastAccess')
def __init__(self):
object.__setattr__(self,'modified',False)
object.__setattr__(self,'lastAccess',time.time())
def setModified(self):
object.__setattr__(self,'modified',True)
object.__setattr__(self,'lastAccess',time.time())
def resetTime(self):
object.__setattr__(self,'lastAccess',time.time())
def __setattr__(self,name,value):
if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
self.setModified()
class example(CacheObject):
__slots__ = ('abc',)
def __init__(self,i):
self.abc = i
super(example,self).__init__()
t = time.time()
f = example(0)
for i in range(100000):
f.abc = i
print(time.time()-t)
我测量了处理时间,它花了 2 秒。当我注释掉被覆盖的函数时,处理时间是 0.1 秒,我知道被覆盖的函数会更慢,但几乎 20 倍的差距太大了。我想我一定是搞错了。
接受 cfi 的建议
1.消除if条件
def __setattr__(self,name,value):
# if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
self.setModified()
运行时间降低到 1.9,略有改进,但如果不更改则标记对象已修改会在其他进程中花费更多,所以不是一个选项。
2.将self.func改为classname.func(self)
def __setattr__(self,name,value):
if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
CacheObject.setModified(self)
运行时间是 2.0 。所以没有什么真正改变
3)提取集修改函数
def __setattr__(self,name,value):
if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
object.__setattr__(self,'modified',True)
object.__setattr__(self,'lastAccess',time.time())
运行时间降低到 1.2 !太好了,它确实节省了将近 50% 的时间,尽管成本仍然很高。