我在Python中有一个类,它为给定的数据训练一个模型:
class Model(object):
def __init__(self, data):
self.data = data
self.result = None
def train(self):
... some codes for training the model ...
self.result = ...
创建了Model对象之后,
myModel = Model(myData)
模型没有训练,那么我可以调用train
方法来启动训练:
myModel.train()
然后myModel.result
将就地更新。
另外,我可以将train
方法重写为:
def train(self):
... some code for training the model ...
result = ...
# avoid update in-place
trainedModel = copy.copy(self)
trainedModel.result = result
return trainedModel
这样,通过调用myTrainedModel = myModel.train()
,我得到了一个新对象,并且原始myModel
的状态没有改变。
**我的问题是:**哪种方法更常用,可以存储类中方法返回的结果?
2条答案
按热度按时间qv7cva1a1#
我的问题是:哪一种方法更常用来存储类中方法返回的结果?
这真的很难说,你的例子把它缩小到一个非常具体的用例,即使它更广泛,一个完全没有主观性的答案可能是不可能找到的。
尽管如此,我也许可以提供一些信息,可以帮助您指导您的决定。
纯函数是指不会触发任何副作用的函数,它们不会修改函数外部的任何状态,通常被认为是最容易正确使用的函数类型之一,因为副作用是开发过程中常见的触发点("这个系统的哪个部分导致这个状态变成这个状态?")一个没有副作用的函数几乎不会被触发。
你的第二个版本是一个纯粹的函数。它没有副作用:它返回一个新训练的
Model
,它不影响任何已经存在的东西。纯函数本质上也是线程安全的,因为它们不修改共享状态,所以对并发范例非常友好。
然而,在许多程序中,触发副作用的函数通常是实际需要的。从单线程效率的Angular 来看,任何面临修改复杂状态或返回全新状态之间选择的函数都可能因为执行后者而严重瓶颈化。
想象一下,作为一个总的例子,一个函数在一个图像上绘制一个像素,返回一个完整的新图像,其中一个像素被绘制到图像上,而不是修改传入的图像。这往往会立即成为一个严重的瓶颈。另一方面,如果我们返回的结果并不复杂(例如:只是一个整数或非常简单的聚合),通常纯函数甚至更快。
因此,在某些情况下,当结果复杂且创建成本高昂时,触发副作用(理想情况下只有一个逻辑副作用,以避免成为令人困惑的bug源)的函数通常是实际需要的。
所以这里的选择可以归结为一个纯函数或"不纯"函数,这有一个副作用。因为我们处理的是面向对象的场景,另一种看待这个问题的方式是可变性与不可变性(这通常与纯函数和"不纯"函数有类似的区别)。我们可以训练
Model
或创建并返回训练过的Model
,而不接触现有的Model
。选择哪一个可能"更好"取决于你追求的是什么。如果安全性和可维护性是你的目标,那么纯版本可能会更有帮助。如果创建和返回一个新模型的成本很高,而效率是你的主要目标,那么训练一个现有的模型可能会帮助你避免瓶颈。
如果有疑问,我建议使用pure版本。安全性和可维护性等提高生产力的特性在担心性能之前往往是第一位的。稍后,您可以获取一个分析器并深入到您的热点,如果您发现返回全新的训练模型是一个瓶颈,您可以,比如说,添加一个新的方法来就地训练模型,用于您最关键的代码路径。
mi7gmzs62#
classmethod()是Python中的一个内置函数,它为给定的函数返回一个类方法。
班级学生:
学生.打印名=类方法(学生.打印名)
学生.正楷姓名()