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.
两种方法的优缺点:
内存方面:
返回的列表是用于排序版本的列表,因此这意味着在这种情况下,在任何给定时间只有一个列表完全存储在内存中,使用生成器版本。
这使得生成器版本在内存方面更高效。
速度:
此处具有完整列表的版本获胜。
要创建一个基于生成器的新列表,必须创建一个空列表(或最多使用第一个元素),并将每个后续元素附加到列表中,这可能会引发可能的尺寸调整步骤。
要根据以前的列表创建一个新列表,列表的大小是事先已知的,因此可以一次分配并分配每个条目(可能,这里还有其他优化,但我可以'支持它)。
因此,就速度而言,列表胜出。
“什么是最好的”的答案归结为任何工程领域中最常见的答案……这取决于……。