【问题标题】:Python Performance - for loops with method without looped variablesPython 性能 - 带有没有循环变量的方法的循环
【发布时间】:2016-07-15 13:52:39
【问题描述】:

我对性能有疑问,无法找到 python 在每种情况下的行为方式:

def something(object):
    if object== 'something':
        return 1
    else:
        return 0

选项 1:

def something_bigger(list, object):
    total= 0
    for item in list:
        total+= something(object)

def something_bigger2(list, object):
    total= 0
    for item in list:
        total-= something(object)

选项 2:

def something_bigger(list, object):
    total= 0
    something = something(object)
    for item in list:
        total+= something(object)

def something_bigger2(list, object):
    total= 0
    something = something(object)
    for item in list:
        total-= something(object)

这些例子很简单,没有任何意义,但我的目标是了解 python 是否理解 `something() 返回总是相同 并且 不会重复 if 无休止的时间 b>.

选项二,不了解 python 将如何做到这一点,似乎更快,但另一方面我重复我的代码!

【问题讨论】:

  • 这取决于特定的解释器以及它在识别和优化这些特定案例方面的能力。从根本上说,您告诉 Python 每次都重复 if..else
  • 不,Python 解释器不会推断它可以避免分支(因为它不知道可以避免分支)。你知道的,所以相应地编写代码。
  • 那么最好的方法是在for之外调用带有不可变变量的方法?
  • CPython 不会优化您的代码,PyPy 和 Pyston 会尝试这样做。如果你可以避免多次something 调用,那就去做吧。
  • 通常当您对性能有疑问时,您会分析您的代码。试试 cProfile 矿石 line_profiler。

标签: python


【解决方案1】:

没有。 Python 不像 Java 或 C# 应用程序(例如)那样编译。一行代码仅在执行时才被正确评估。

我几周前问的这个问题确实可以详细说明其中一个 Python的核心区别: Why doesn't Python spot errors before execution?

当然,这是一个不同的问题,但要点是一样的。 Python 甚至不知道下一条指令是什么。另一方面,C 或 C++ 被编译成汇编指令列表。

这就是您需要解释器来运行脚本的原因。

您所描述的是分支预测。这个著名的问题有一个非常好的解释:

Why is it faster to process a sorted array than an unsorted array?

但是 Python 不像 C++ 那样编译成汇编。指令没有以足够原始的格式馈送到 CPU 以使分支预测保持一致。您必须自己检测这种行为并加以纠正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多