【问题标题】:Python extent of optimisation (Common subexpression elimination)Python 优化程度(通用子表达式消除)
【发布时间】:2013-08-02 21:49:54
【问题描述】:

假设我必须将一行拆分为一个键和一个值,并将其放入名为 propsdict 中。让分隔符为=。我可以这样做:

props[line.partition('=')[0]] = line.partition('=')[2]

或者这个:

splits = line.partition('=')
props[splits[0]] = splits[2]

第一种形式是对字符串进行两次分区,还是将其优化为只进行一次?我想它是依赖于实现的,但是常见的实现会这样做吗(CPython Jython,IronPython)?我知道这是过早的优化。我是 python 新手,我只是好奇。

【问题讨论】:

    标签: python optimization python-2.7


    【解决方案1】:

    字符串在第一种情况下被拆分两次。

    作为一种动态语言,Python 无法确定 line 的值是不可变的,并且 .partition() 方法每次都会返回相同的结果。只能每次执行line.partition('=')

    【讨论】:

    • 我当然希望一旦它是你的,你可以分配给splits。还是必须先对其进行切片并创建一个全新的对象,然后才能做有用的事情? (不管怎样,第二个例子可能不会做 OP 所希望的......它不会影响原始字符串。)
    • @cHao:啊,我明白你的意思了。
    • 其实,我认为你一开始是对的。 partition 返回一个元组,元组看起来是不可变的;您必须先将这些值放在列表中,然后才能重新分配它们。
    • @cHao:再次调整。
    • 谢谢各位!其实我从来不想重新分配splits[0]。这是代码中的错字,我现在更新了问题。不过,对我来说很好的额外知识:)
    【解决方案2】:

    Python 字节码编译器/解释器非常简单(我敢说,原始的)并且除了一些非常基本的常量折叠和如果被问到抛出断言之外不执行任何优化。当然没有通用的子表达式消除通行证。

    【讨论】:

    • 谢谢! +1 用于提及子表达式消除。我现在可以阅读更多内容。不知道是这么叫的。我会用它来更新问题,以便它对未来的搜索者有用。
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多