我想節省時間並將對象標記爲已修改,所以我編寫了一個類並覆蓋了它的__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