python - 代码重复和性能之间的权衡

标签 python performance optimization code-duplication

Python 作为一种动态语言,提供了多种方法来实现相同的功能。这些选项在可读性、可维护性和性能方面可能有所不同。尽管我通常用 Python 编写的脚本是一次性的,但我现在有一个我正在从事的(学术)项目必须是可读的、可维护的并且性能相当好。由于我之前没有用 Python 进行过任何认真的编码,包括任何类型的分析,所以我需要帮助来决定上面提到的三个因素之间的平衡。

这是我正在处理的科学包中的一个模块的代码片段。它是一个具有非常基本骨架结构的 n 叉树类。这是在考虑继承和子类的情况下编写的。

注意:在下面的代码中,树与节点相同。每棵树都是同一类 Tree 的实例。

class Tree(object):

    def __init__(self, parent=None, value=None):
        self.parent = parent
        self.value = value
        self.children = set()

下面的两个函数属于此类(以及许多其他函数)

    def isexternal(self):
        """Return True if this is an external tree."""
        return not bool(self.children)

    def isleaf(self):
        """Return True if this is a leaf tree."""
        return not bool(self.children)

这两个函数做着完全相同的事情——它们只是两个不同的名称。那么,为什么不将其更改为:

    def isleaf(self):
        """Return True of this is a leaf tree."""
        return self.isexternal()

我的疑问是这些:

我读到 Python 中的函数调用相当昂贵(为每次调用创建新堆栈),但我不知道如果一个函数依赖于另一个函数是好事还是坏事。它将如何影响可维护性。这在我的代码中多次发生,我从另一个方法调用一个方法以避免代码重复。这样做是不好的做法吗?

这是同一类中此代码重复场景的另一个示例:

def isancestor(self, tree):
    """Return True if this tree is an ancestor of the specified tree."""
    return tree.parent is self or (not tree.isroot() 
        and self.isancestor(tree.parent))

def isdescendant(self, tree):
    """Return True if this tree is a descendant of the specified tree."""
    return self.parent is tree or (not self.isroot() 
        and self.parent.isdescendant(tree))

我可以改为:

def isdescendant(self, tree):
    """Return True if this tree is a descendant of the specified tree."""
    return tree.isancestor(self)

最佳答案

非常从广义上讲,有两种类型的优化:宏观优化微观优化。宏观优化包括您选择的算法、决定不同的数据结构等。 会对性能产生重大影响的事情,如果您改变主意,通常会对您的代码库产生巨大的链式 react 。从具有线性 O(n) 的数据结构切换到具有常量 O(1) 插入的数据结构可能是一个巨大的胜利,并且非常值得为此付出代价。添加缓存可能会将慢狗算法变成快如闪电的算法。

微优化是诸如省略或内联函数调用、删除或添加变量、为非常短的窗口缓存计算结果、展开循环等。通常,您应该忘记这些类型的优化和重点关于代码的可读性和可维护性。微优化的效果太小,不值得。

分析代码后,您应该只考虑这些类型的更改。如果您可以确定一个可以从这种优化中受益的关键循环,并且您的分析确认它会,并且您进行更改并验证改进与另一轮分析的工作 - 然后 你应该微优化。

但在那之前,不要为小事担心。

def isdescendant(self, tree):
    """Return True if this tree is a descendant of the specified tree."""
    return tree.isancestor(self)

我绝对会推荐这种类型的代码重用。它清楚地表明 isdescendantisancestor 的倒数。它确保两个函数以相同的方式工作,因此您不会无意中在一个函数中引入错误,而在另一个函数中引入错误。

def isleaf(self):
    """Return True of this is a leaf tree."""
    return self.isexternal()

在这里我会问自己 isleafisexternal 在概念上是否相同。忽略它们的实现方式相同,它们在逻辑上是否相同?如果是这样,我会让一个人调用另一个人。如果只是碰巧他们有相同的实现,我可能会复制代码。您能想象这样一种场景,您想要更改一个功能而不是另一个吗?这将指向重复。

关于python - 代码重复和性能之间的权衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31688034/

相关文章:

python - 优化代码以检查列表元素是否唯一

Python 系列和重采样

Python-docx 无法使用现有文档 - 没有名称为 'Title' 的样式

python - 如何优化这个python代码?我需要改进它的运行时间

MySQL 求和查询需要很长时间才能完成。寻找瓶颈

visual-c++ - 读指令的写访问冲突

python - Keras LSTM 密集层多维输入

python - PANDAS 粗略日期(月/年)

java - 应用程序引擎在任务突发期间中止请求错误

Python Scipy Optimizer Minimize : Constraints and bounds are not working as expected, 如何使其工作?