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

Python 使用不同方法获得相同结果时的性能差异,python,time,Python,Time,我一直在学习执行同一任务的不同方法,也在学习以不同的方式执行同一任务。我可以理解执行使用不同方法的代码所需的时间可能不同,但我不理解为什么使用相同方法执行相同任务但编写方式不同的代码的总执行时间平均不相同 比如说 我可以跑: for sub in original_list: if sub[0] in to_check: new_list.append(sub) 在我的一段代码中,我的平均执行时间约为2.6毫秒 但是,如果我将代码更改为一行代码,如下所示: new_li

我一直在学习执行同一任务的不同方法,也在学习以不同的方式执行同一任务。我可以理解执行使用不同方法的代码所需的时间可能不同,但我不理解为什么使用相同方法执行相同任务但编写方式不同的代码的总执行时间平均不相同

比如说

我可以跑:

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毫秒

据我所知,两者都做相同的操作,所以这就引出了几个问题

  • 时间的变化从何而来
  • 是缩放吗?例如,如果我迭代一个非常大的列表,时差会变得更大还是会保持在0.10毫秒左右
  • 或者我只是很困惑,这两个操作并不像我最初想象的那样完全相同

  • 我很想知道这是否有原因……

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

     new_list.append(sub)
    
    在循环中迭代时,每次python到达该行时,它都必须:

  • locals()
    命名空间中查找新的\u列表
  • 查找该对象上的append方法(哈希查找!)
  • 调用append函数

  • 与列表理解相比,
    .append的“点查找”每次都在进行中,列表理解从结构中知道它在追加。

    您在
    [s代表列表中的s]中编写的片段
    被称为列表理解,它们通常与在第一个块中写出循环一样快或更快。谷歌列出python的理解,并阅读它们。也许这个链接会回答你的问题。你还可以了解理解和生成器之间的区别,这也会减少你的内存需求。因此,它们是不同的,并不像我想象的那样做。我不知道它在编辑列表和for循环的方式上有些不同。这仍然留下了一个问题,那就是缩放是什么?我使用列表理解还是for循环真的很重要吗?当处理大量的数据时,会有不同吗?那么列表理解是否不会多次执行所有这些任务呢?在过去的2个半月里,我唯一真正花时间学习的代码是python,所以我不确定是什么让C运行得更快。或者甚至python如何知道它将运行“优化的c代码”,在python中有小块c是很常见的吗?@BaconTech,不要过多地考虑我评论中的“c”部分,多考虑python部分。在for循环的每次迭代中,python都会到达该行,并且必须进行字典查找,以找到“new_list”对象的“append”属性。它不会以任何方式缓存。PyPy可以执行这些类型的优化,以超越cPython代码。感谢您的澄清,现在这更有意义了:)