【发布时间】:2017-12-03 18:06:44
【问题描述】:
我试图了解 Python 中列表解析的性能,以及使用它们与 for 循环创建列表的权衡。使用 for 循环将元素追加到列表的已知性能成本之一是,在每次迭代时,它是 O(k)(其中 k 是列表的长度),因为追加需要到达列表的末尾添加一个额外的元素。
这对列表推导有什么作用?在每次迭代时,是否需要到达新列表的末尾才能追加一个新元素?
# For loop:
# O(n*k) (k=number of elements currently in list) time complexity:
new_list = []
for i in range(n): # O(n)
new_list.append(i) # O(k)
# List comprehension:
new_list = [i for i in range(n)] # Is this O(n)?
我搜索了 Python 文档、Stack Overflow 和其他网站,但找不到任何相关信息。有许多资源可获取有关列表理解的更多更高级别的信息,但没有这样的具体信息。
如果您无法提供答案,请指导我或告诉我如何查看实际的底层 Python 列表理解代码,以便我自己完成此操作?
【问题讨论】:
-
new_list.append(i)不是O(k)。插入可能是。但它们被优化为使用append -
查看cython源代码?为了提高性能,您可以使用
% timeit魔术运算符。 -
“列表推导比等效的 for 循环运行得快一点(除非你只是想丢弃结果)。”来自:wiki.python.org/moin/PythonSpeed
标签: python python-3.x list