python - 使用生成器作为 sorted() 的输入而不是列表理解是否值得

标签 python optimization generator list-comprehension sorting

<分区>

Possible Duplicate:
sorted() using Generator Expressions Rather Than Lists

我们都知道一直使用生成器而不是实例化列表可以节省时间和内存,尤其是当我们经常使用推导式时。

这里有一个问题,请考虑以下代码:

output = SomeExpensiveCallEgDatabase()
results = [result[0] for result in output]
return sorted(results)

对排序的调用将返回结果的排序列表。如下声明结果然后调用 sorted 是更好还是更坏?

results = (result[0] for result in output)

我的猜测是对 sorted() 的调用将遍历生成器并实例化一个列表本身,以便对其运行快速排序或合并排序。所以在这里使用生成器没有任何优势。这个假设是否正确?

最佳答案

我相信您的假设是正确的,因为如果不先将整个列表存储在内存中,就没有简单的方法可以对集合进行排序(至少肯定不会使用默认排序算法,如果我没记错的话,是 TimSort)。

检查一下: sorted() using Generator Expressions Rather Than Lists

要创建新列表,内置的排序方法使用 PySequence_List:

PyObject* PySequence_List(PyObject *o) Return value: New reference. Return a list object with the same contents as the arbitrary sequence o. The returned list is guaranteed to be new.

两种方法的优缺点:

内存方面:

返回的列表是用于排序版本的列表,因此这意味着在这种情况下,在任何给定时间只有一个列表完全存储在内存中,使用生成器版本。

这使得生成器版本在内存方面更高效。

速度:

此处具有完整列表的版本获胜。

要创建一个基于生成器的新列表,必须创建一个空列表(或最多使用第一个元素),并将每个后续元素附加到列表中,这可能会引发可能的尺寸调整步骤。

要根据以前的列表创建一个新列表,列表的大小是事先已知的,因此可以一次分配并分配每个条目(可能,这里还有其他优化,但我可以'支持它)。

因此,就速度而言,列表胜出。

“什么是最好的”的答案归结为任何工程领域中最常见的答案……这取决于……

关于python - 使用生成器作为 sorted() 的输入而不是列表理解是否值得,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11794381/

相关文章:

Python ElementTree 对 HTML 实体进行转义

python来自自定义模块ModuleNotFoundError : No module named 'activity'

python - 是什么导致 symfit 出现此警告?

java - 速度优化java字符串包含与正则表达式匹配

python - 总和有什么作用?

python - 检查字符串包含/不包含不同列表中的值

python - 方矩阵遍历对具有相同值的相邻单元格进行分组

python - 不平等加入 Pandas ?

excel - 使用 VBA 删除行的最有效方法

javascript - 在 ES6 中, 'generator' 实际上如何在 V8 引擎内暂停?