我读到了 List comprehension without [ ] in Python所以现在我知道了
''.join([str(x) for x in mylist])
比
快''.join(str(x) for x in mylist)
因为“列表理解是高度优化的”
所以我假设优化依赖于 for
表达式的解析,查看 mylist
,计算它的长度,并使用它来预分配确切的数组大小,这节省了大量的重新分配。
当使用 ''.join(str(x) for x in mylist)
时,join
盲目接收生成器并且必须在不知道大小的情况下构建其列表提前。
但现在考虑一下:
mylist = [1,2,5,6,3,4,5]
''.join([str(x) for x in mylist if x < 4])
python 如何决定列表理解的大小?它是根据 mylist
的大小计算的,并在迭代完成时缩小尺寸(如果列表很大并且条件过滤掉 99% 的元素,这可能非常糟糕),还是恢复原状对于“事先不知道尺寸”的情况?
编辑:我做了一些小的基准测试,它似乎证实了有一个优化:
没有条件:
import timeit
print(timeit.timeit("''.join([str(x) for x in [1,5,6,3,5,23,334,23234]])"))
print(timeit.timeit("''.join(str(x) for x in [1,5,6,3,5,23,334,23234])"))
产量(如预期):
3.11010817019474
3.3457350077491026
有一个条件:
print(timeit.timeit("''.join([str(x) for x in [1,5,6,3,5,23,334,23234] if x < 50])"))
print(timeit.timeit("''.join(str(x) for x in [1,5,6,3,5,23,334,23234] if x < 50)"))
产量:
2.7942209702566965
3.0316467566203276
所以条件 listcomp 仍然更快。
最佳答案
列表理解不会预先确定列表的大小,即使它们完全可以。您假设存在实际未完成的优化。
列表理解速度更快,因为所有迭代器机制以及进入和退出 genexp 堆栈框架的工作都有成本。列表推导不需要支付那个成本。
关于python - python如何优化条件列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519707/