Как / почему оптимизировать код путем копирования атрибутов класса в локальные переменные? - PullRequest
1 голос
/ 20 марта 2019

У меня есть функция, которая запускает численное моделирование.Входных данных для основной функции так много, что я создал класс (без методов) для их хранения, что-то вроде:

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 )   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...