我有一个运行的数值模拟功能。 在主函数的输入这么多,我已经创建了一个类(没有方法)来存储所有这些,是这样的:
myinput=MyInput()
myinput.file1 = file1
myinput.file2 = file2
myinput.something = something
run_model(myinput)
我在想,一个优化代码的方法是让众多功能,这是该计划的一部分读取的局部变量,而无需访问MyInput类的对象来创建局部变量 。 这是因为大多数这些变量都需要进行多次访问,我想有是访问classinstance.attribute代替所以LocalVariable的成本。 例如:
def myfun(myinput):
something=myinput.something
step1=fun1(something)
step2=fun2(something)
out=something + step1 + step2
这是推理是否正确? 我曾与下面的代码测试它,我看到约30%的改善。 有没有改善它的另一种方式? 这是可以预料的? 在我走上重构所有我的代码,我想了解它背后的理论。
为什么访问myclass.attributes在性能方面如此昂贵? 它是一个Python的限制,或者这是常见的其他语言,也?
import timeit
class MyClass:
def __init__(self,a,b,c,d,e):
self.a=a
self.b=b
self.c=c
self.d=d
self.e=e
def fun_local(myclass, size):
a=myclass.a
b=myclass.b
c=myclass.c
d=myclass.d
e=myclass.e
for i in range(size):
x = (a+b)**c+d*e
def fun(myclass, size):
for i in range(size):
x= (myclass.a + myclass.b)** myclass.c + myclass.d * myclass.e
myclass=MyClass(8,4,4,10,100)
rep=3
num=10
size=int(1e6)
res_local = min( timeit.Timer( "fun_local(myclass, size)", globals=globals() ).repeat(repeat= rep, number = num ) )
res_noloc = min( timeit.Timer( "fun(myclass, size)", globals=globals() ).repeat(repeat= rep, number = num ) )