使用不同方法获得相同结果时的性能差异

时间:2017-04-24 20:17:50

标签: python time

我一直在学习执行相同任务的不同方法,以及以不同方式编写相同方式执行相同任务。我可以理解执行使用不同方法的代码所花费的时间可能会花费不同的时间来执行,但我不明白为什么在同一方法中执行相同任务但只是以不同方式编写的代码可能会有总执行时间这不是平均相同的。

例如。

我可以跑:

for sub in original_list:
    if sub[0] in to_check:
        new_list.append(sub)

在我的代码的一部分中,我的平均执行时间约为2.6毫秒

但是,如果我将代码更改为一行,如下所示:

new_list = [sub for sub in original_list if sub[0] in to_check]

执行时间平均为2.4毫秒。

据我所知,它们都做了同样的操作,因此这提出了几个问题。

  1. 来自时间的变化在哪里?
  2. 是缩放吗?例如,如果我迭代一个非常大的列表,时间差会变得更大还是时差会保持在0.10毫秒左右?
  3. 或者我只是非常困惑,这两个操作并不像我原先想的那样相同?
  4. 我很想知道这是否有原因...

1 个答案:

答案 0 :(得分:2)

列表理解更快,因为它是针对python运行的优化c代码。特别要考虑以下几行:

 new_list.append(sub)

在循环中迭代时,每次python到达该行时都必须:

  1. locals()命名空间
  2. 中查找new_list
  3. 在该对象上查找append方法(哈希查找!)
  4. 调用追加功能
  5. "点查找" .append每次都要进行paragraph.getCTP().getPPr().getRPr().isSetB(),与列表理解相比,它从结构中知道它附加的内容。