为什么字典的 items 方法比简单的迭代快得多?

问题描述

我正在使用 LeetCode 练习,但遇到了 this 问题。我只是在python中学习算法和数据结构,所以不太了解一些内置方法是如何实现的,所以我最初的尝试是(python代码

return [num for num in Counter(nums) if Counter(nums)[num] == 1]

但是在 this testcase 上运行需要整个 12.82 秒。另一方面,讨论中有very similar one liner

return [c[0] for c in Counter(nums).items() if c[1] == 1]

使用相同的想法但运行速度更快,上述测试用例仅用了 0.0022 秒。为什么在运行时会有如此大的差异?

解决方法

此代码的问题:

return [num for num in Counter(nums) if Counter(nums)[num] == 1]

是对于num中的每个Counter(nums),您必须创建一个新的Counter(nums)来确定if条件是真还是假。通过在第二个版本中使用 Counter(nums).items()

return [c[0] for c in Counter(nums).items() if c[1] == 1]

您已经可以访问该数字及其计数,因此无需重新计算每个数字的计数。

注意我会把理解写成

return [num for num,count in Counter(nums).items() if count == 1]

使其工作原理更加明显。