我想节省时间并将对象标记为已修改,所以我编写了一个类并覆盖了它的__setattr__
函数。重写__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.elimate如果条件
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.change self.func到classname.func(个体经营)
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)提取SetModified之功能
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%的时间,但成本仍然很高。
感谢您的号码反馈!我们可以争辩说涉及两个函数调用,并且由于删除一个将开销减少了50%,所以您可能会遇到剩余的开销。但也许别人有更多的想法。 – cfi