【问题标题】:computational cost of ABC [closed]ABC的计算成本[关闭]
【发布时间】:2016-01-18 02:57:36
【问题描述】:

我过去使用过 abc,我想再次使用它们,以使用 @abstractmethod 强制执行纯虚拟方法。这是在 Python 前端到用户将经常扩展的 API 的上下文中。

开发一个可靠的综合测试规模对我来说有点太复杂了,而且我一直使用 abc 作为一个黑魔法封闭盒子,所以我不知道抽象和检查摘要的成本在哪里,以及可能发生的时间,或者成本的实际情况或规模。

我在任何地方都找不到令人满意的基础机制的完整信息,因此任何关于何时何地发生魔法以及以何种成本发生的指针将不胜感激(导入?实例化?如果实例扩展,成本会翻倍?)

有关用例的更多信息: 与以前的用例不同(对我而言),每个基础对象的实例数量非常有限,并且 abc 测量到没有可感知的开销,这一次将是针对某些东西(DAG 中具有树视图的节点)可以实例化然后在适当位置扩展数百次,并且每个类的虚拟方法的数量可能会达到十几个左右。

继承从来不是多重的,而且通常很浅,最多两三个深,大多数时候只有一个。

Python 2.7 由于第 3 方平台的限制。

【问题讨论】:

    标签: python performance python-2.7 abc


    【解决方案1】:

    在 Python 2.6 之前,使用 ABC 会带来一些巨大的开销。 Issue 1762 将此报告为一个错误,并已针对 Python 2.6 进行了修复(通过将一些 ABC 机制移动到 object 的 C 实现中)。

    在较新版本的 Python 中,使用 ABC 和使用非 ABC 的类之间的性能差异应该很小(该错误提到 isinstance 检查的速度存在非常小的剩余差异,但其他操作本质上具有性能差异为零)。

    【讨论】:

    • 我没想过看问题;谢谢,这很有帮助。您是否知道@abstractmethod 的第一次验证是在导入时发生(或在建立第一个依赖项时),还是有些延迟?这是我的假设(在导入时),但充其量只是一种直觉。
    • 是的,几乎所有的工作都是在定义抽象类时发生的。可以看到abc module的实现。从模块的代码中不明显的是它实际上是如何阻止使用抽象方法创建对象的。这就是在typeobject.c 中移动到C 代码中的位。如果__abstractmethods__ 被分配了一个非空列表,type_set_abstractmethods 设置一个标志。然后,object_new` 在创建新对象之前检查该标志。
    • 这就是我需要知道的。如果我有其他疑问,也可能会快速戳一下源代码,我没有看过狗时代的 cpy 源代码。再次感谢。
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多