Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更好的性能:奇特的对象还是大量的功能?_Python_Oop_Functional Programming - Fatal编程技术网

Python 更好的性能:奇特的对象还是大量的功能?

Python 更好的性能:奇特的对象还是大量的功能?,python,oop,functional-programming,Python,Oop,Functional Programming,Python中的示例 我处理的数据只有两个值:起点和终点。让我们想象这些对应于染色体的起点和终点。因此,数据如下所示: (1,50) (20, 500) (40, 80) ... 现在我需要添加一些功能。例如,假设我想开始使用这些作为集合,或者按照开始值对它们进行排序。我偏向OOP的第一个倾向是为这些对象创建一个小类,该类将具有start、end等属性和as_set等方法 另一种设计方法是创建具有严格调用签名的函数库: def as_set(start, end): return

Python中的示例

我处理的数据只有两个值:起点和终点。让我们想象这些对应于染色体的起点和终点。因此,数据如下所示:

(1,50)
(20, 500)
(40, 80)
...
现在我需要添加一些功能。例如,假设我想开始使用这些作为集合,或者按照开始值对它们进行排序。我偏向OOP的第一个倾向是为这些对象创建一个小类,该类将具有start、end等属性和as_set等方法

另一种设计方法是创建具有严格调用签名的函数库:

 def as_set(start, end):
     return set(range(start, end))

我认为,具有属性访问权限的Range对象将使涉及排序的操作更加容易,但代价是什么。在半性能危急的情况下,您会不惜一切代价避免使用类,还是内存开销通常值得这样做?换句话说,在什么情况下应该避免实现新类来存储简单数据?例如,这会减慢NP难算法的速度,还是仅仅增加内存开销,同时或多或少地保留算法的大O?我知道这取决于用例,但我正在寻找关于何时走一条路线与另一条路线的一般考虑。

不要提前优化。。。。做任何最有意义的事情,然后对其进行分析,找出并改进瓶颈。在一般情况下,这很难回答;以速度换取空间是计算领域的经典优化。在您的特定情况下,我会编写函数,如果您不知道我的意思,如果出现性能问题,我会将其记忆为Google dynamic programming,确保每个唯一的开始、结束对的集合只创建一次。你的范围绝对是太大了-一般来说,如果你只实现了uuu init_uuuuuuuuuuuuuuuuuuuuuu和其他方法,你不应该使用类。谢谢jon。我从来没听过那个经验法则。在需要属性访问的情况下如何?您是说,属性访问不值得内存开销吗?如果您确实想要启动和停止,请不要忘记步骤!您可以创建一个而不是一个类;这将提高内存效率,因为它们是轻量级的,不需要比常规元组更多的内存。然后,您可以使用一个记忆工厂函数来轻松创建适当的实例。但我同意@JoranBeasley的观点,不要过早地进行优化。将as_set设置为一个方法意味着您可以隐藏在类中表示范围对象数据的内部方式,从而使以后更容易更改,而无需修改您或其他人编写的一系列外部实用程序函数。它被称为,并且是面向对象编程范例的一个关键特性。
 def as_set(start, end):
     return set(range(start, end))