Je veux enregistrer l'heure et marquer l'objet comme modifié, j'ai donc écrit une classe et remplacer sa fonction __setattr__
.le coût de réécriture __setattr__() était trop élevé
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)
J'ai mesuré le temps de traitement et cela a pris 2 secondes. Quand j'ai commenté sur la fonction surchargée, le temps de traitement était de 0,1 seconde, je sais que la fonction surchargée serait plus lente mais presque 20 fois l'écart est trop important. Je pense que je dois me tromper.
prendre la suggestion de tpi
1.elimate la condition if
def __setattr__(self,name,value):
# if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
self.setModified()
le temps de fonctionnement à 1,9, un peu améliorer, mais marquer l'objet modifié si cela ne change coûterait plus cher dans d'autres processus, donc pas une option.
2.CHANGER self.func à classname.func (auto)
def __setattr__(self,name,value):
if (not hasattr(self,name)) or object.__getattribute__(self,name)!=value:
object.__setattr__(self,name,value)
CacheObject.setModified(self)
de temps d'exécution est de 2,0 .donc rien n'a vraiment changé
3) Extrait fonction 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())
fonctionnement Le temps passé à 1,2 !! C'est génial, cela permet d'économiser près de 50% du temps, même si le coût reste élevé.
Merci pour les commentaires de vos numéros! Nous pourrions argumenter qu'il y a deux appels de fonction impliqués, et puisque la suppression d'un a réduit l'overhead de 50%, vous pourriez être coincé avec le surcoût restant. Mais peut-être que quelqu'un d'autre a plus d'idées. – cfi