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