如何/为什么要通过优化复制类代码属性,局部变量?(How / why to optimise cod

2019-09-26 06:33发布

我有一个运行的数值模拟功能。 在主函数的输入这么多,我已经创建了一个类(没有方法)来存储所有这些,是这样的:

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 )   )
文章来源: How / why to optimise code by copying class attributes to local variables?