![](/img/trans.png)
[英]How to access object atribute inside a list of objects that is an atribute of a class in python?
[英]Long list of parameters of class method in Python: local, argument or class atribute?
我有一个带有许多功能的Python类。 评估每个函数需要一长串常量(几十个)。 每个函数的常数都不同。 每个函数将被调用多次(以百万计),因此性能是一个主要问题。 从可读性和速度上来说,处理这种情况的正确方法是什么? (我是python的新手)
我可以设置常量类的属性,但这似乎与范围提供的安全性冲突(每个常量仅在单个函数中本地使用)。 同样,能够在不同的函数中使用相同的变量名将很方便。 此外,我发现所有的self.
s使代码不可读,尤其是在尝试将行长保持在79以下时。
现在,我在每个函数的开头都在本地定义了常量。 这很明显,但是我不确定在性能方面是否最佳? 是否为每个函数调用分配并释放了新的内存? 特别是因为您显然无法在Python中声明适当的常量。
也许最好将每个函数的参数放在单独的类中,然后将该类的对象作为参数传递? 这将保持适当的范围,同时确保每个常量仅定义一次?
我使用带有单个参数r
的逻辑映射进行了一些速度测试,例如。 在函数开始时在本地定义r
可获得最佳性能,而将r
设置为类属性或将其作为参数(单独或作为参数类实例的属性)传递给函数将使计算时间增加大约10倍%。 因此,我想解释器会认识到以下事实:创建对象时,局部定义的r
是常数。 (请注意,我仅使用单个参数进行测试,因此在更复杂的模型中差异可能更大。)
如果有人好奇,这是测试代码:
import matplotlib.pyplot as plt
import timeit
# Define class
class Mod:
def __init__(self):
self.reset()
# self.r = 3.9 # -> uncomment when testing class attribute
return
def reset(self):
self.x = 0.5
def step(self): # -> add r when testing argument
# ARGUMENT
# self.x = r*self.x*(1-self.x) # +10% computation time
# CLASS ATTRIBUTE
# self.x = self.r*self.x*(1-self.x) # +10% computation time
# LOCAL
r = 3.9
self.x = r*self.x*(1-self.x)
# Length of test
trials = int(1e5)
T = int(1e3)
# r = 3.9 # -> uncomment when testing class attribute
# start timer
t0 = timeit.default_timer()
for _ in range(trials):
x = []
m.reset()
for _ in range(T):
m.step() # -> add r when testing argument
x.append(m.x) # do something with data to avoid interpreter tricks
# print computation time
print(timeit.default_timer() - t0)
plt.plot(x)
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.