Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一类的不同实例的后续副本上的deepcopy时间加倍_Python_Performance_Copy - Fatal编程技术网

Python 同一类的不同实例的后续副本上的deepcopy时间加倍

Python 同一类的不同实例的后续副本上的deepcopy时间加倍,python,performance,copy,Python,Performance,Copy,当在类的实例上从Pythoncopy模块运行deepcopy时,复制过程的时间随着每次迭代而加倍,即使这些实例都属于同一个类,并且(至少在我看来)应该需要相同的复制时间 我正在复制的对象使用kwargs设置一组属性。它最初在\uuuu init\uuuuu中调用了set\u dynamic\u attributes方法,以根据某些逻辑配置某些属性,但为了测试这是否是导致减速的原因,我从\uuuu init\uuuuu中删除了该调用,并专门对其进行了调用 以下是令人不快的部分以及结果: 对于in-

当在类的实例上从Python
copy
模块运行
deepcopy
时,复制过程的时间随着每次迭代而加倍,即使这些实例都属于同一个类,并且(至少在我看来)应该需要相同的复制时间

我正在复制的对象使用
kwargs
设置一组属性。它最初在
\uuuu init\uuuuu
中调用了
set\u dynamic\u attributes
方法,以根据某些逻辑配置某些属性,但为了测试这是否是导致减速的原因,我从
\uuuu init\uuuuu
中删除了该调用,并专门对其进行了调用

以下是令人不快的部分以及结果:

对于in-base\u wpn.base\u攻击:
t0=时间。时间()
a、 设置\u动态\u属性()
t1=时间。时间()
打印('Dyn属性设置时间:'+str(t1-t0))
atk=深度复制(a)
t2=时间。时间()
打印('Deepcopy time:'+str(t2-t1))
结果:

Dyn属性设置时间:0.0
深度复制时间:0.0139993896484375
Dyn属性设置时间:0.0
深度复制时间:0.03599882125854492
Dyn属性设置时间:0.0
深度复制时间:0.04999595231628418
Dyn属性设置时间:0.0
深度复制时间:0.09999823570251465
Dyn属性设置时间:0.0
深度复制时间:0.011002540588378906
Dyn属性设置时间:0.0
深度复制时间:0.021996021270751953
Dyn属性设置时间:0.0
深度复制时间:0.0429990291595459
Dyn属性设置时间:0.0
深度复制时间:0.08499836921691895
Dyn属性设置时间:0.0
深度复制时间:0.17699956893920898
Dyn属性设置时间:0.0
深度复制时间:0.32700061798095703
Dyn属性设置时间:0.0
深度复制时间:0.6589939594268799
Dyn属性设置时间:0.0
深度复制时间:1.4200007915496826
Dyn属性设置时间:0.0
深度复制时间:2.466003656387329
Dyn属性设置时间:0.0
深度复制时间:5.228000164031982
Dyn属性设置时间:0.0
深度复制时间:10.528998374938965
如果它有帮助的话(我知道如果没有更多的代码和大量的对象引用,它是不可指责的),下面是构建实例的对象定义:

class攻击():
定义初始(自我、姓名、武器、**kwargs):
self.name=名称
自我武器
自我技能=[自我武器技能]
self.attack\u mod=self.wealth.attack\u mod
self.parry_mod=-self.wearm.parry_mod#修改对手的招架几率
耐力
self.main_形状=无
self.sliker=无
self.hands=1
自损坏类型='b'
self.base_ap=0
self.hand=True
self.added_mass=self.arm.added_mass
self.length=0#用于增加或减少增加/减少的基本武器长度
self.side_restrict=True#确定攻击是否只能击中敌人的一侧(即右手钩子只能击中左侧)
self.restricted_locs=[]#本次攻击永远无法锁定的位置(即,上勾脚)
自允许角度(u r=[]#允许作为角度索引的角度(0=N->S,7=NW->SE,8=推力)(即N->S带上勾)
自允许角度(U l=[]#允许作为角度索引的角度(0=N->S,7=NW->SE,8=推力)(即N->S带上勾)
self.main_区域=0
self.mech_adv=0
self.force_scalar=1#用于调整攻击的力量/伤害
对于kwargs中的k:
对于键入的self.\u dict\u:
如果k==键:
自我记录更新(kwargs)
#self.set_动态_属性()
def set_动态_属性(自身):
对于自损类型中的t:
如果t==“b”:
如果self.sliker==“main”:
形状=self.arm.main\u形状
其他:
形状='圆形'
如果形状=‘楔形’:
self.main_面积=self.nearm.main_长度*self.nearm.avg_主_宽度
self.mech\u adv=self.nearm.main\u深度/self.nearm.main\u宽度
elif形状==“圆形”:
#使用赫兹的结果,但使用附加质量+拳头质量(.86)和40 f/s2的v构建的固定f值,以及目标的固定p_比
#方程式:https://www.quora.com/Is-the-area-of-contact-between-a-cylinder-and-a-flat-surface-infinitely-small-Is-it-a-point
如果self.sliker==“main”:
材料=自我武器。主要材料
宽度=self.nearm.main\u宽度
长度=自我武器主长度
elif self.sliker==“轴”:
材料==自武器轴\材料
宽度=1
长度=自身武器轴长度
其他:
材料=自我武器。强调材料
宽度=长度=1
e_计算=((1-(材料p_比率*材料p_比率))/(材料弹性*10))+((1-(.4*.4))/5)
自主面积=平方米((4*(.86+自附加质量)*40)*宽度)/(3.514*(e_计算)*最小(长度,8)))
elif self.main_shape==“扁平”:
self.main_面积=最小值(self.arm.main_长度,8)*最小值(self.arm.main_宽度,8)
elif t==“s”:
如果self.main_形状=='blade':
self.main_面积=最小值(self.nearm.main_长度,8)*self.nearm.avg_主宽度
self.mech\u adv=self.nearm.main\u深度/self.nearm.main\u宽度
elif self.main_形状=='de blade':
self.main_面积=最小值(self.nearm.main_长度,8)*self.nearm.avg_主宽度
self.mech\u adv=(self.nearm.main\u depth/2)/self.nearm.main\u width
elif t=='p':