繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM