CPython是否优化了常量集的创建?

时间:2019-02-19 09:56:20

标签: python python-3.x

我有一个简单的功能,可以创建一个更快的查找集。该功能将被大量使用。现在,创建一个集合也要花费一些时间,但是这个集合在程序的生命周期中是固定的。我应该取消它的创建以便只创建一次,还是可以期望Python知道在没有我干预的情况下做很多事情?

示例:可以在下面编写函数吗?还是应该将drop_chars的定义提升到函数之外,使其仅执行一次?

def strip_by_category(word):
    drop_chars = set("abcdefg")
    return "".join(c for c in word if c not in drop_chars)

注释

  1. 是的,我知道在这个示例中应该使用str.translate。它是一个占位符,用于显示常量集的用法。
  2. 我在问Python的最新和最佳版本。历史版本可能有所不同,没关系。

1 个答案:

答案 0 :(得分:2)

涉及函数调用时,CPython不使用常量,因为您始终可以覆盖set来指向另一个函数。在LOAD_CONST条件下使用设定文字时,Python 3.2开始支持in,但仍不分配。

如果只想创建一次集合,则可以将其设置为默认参数,并使用frozenset来防止不必要的突变。

def strip_by_category(word, drop_chars=frozenset("abcdefg")):
    return "".join(c for c in word if c not in drop_chars)