python - python如何优化条件列表理解

标签 python performance list-comprehension

我读到了 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/

相关文章:

python - 图像上框架文本的坐标

performance - 使用 `Optim` 优化非线性函数(样条近似)会产生低性能

mysql - 具有 gpars 的 Groovy 应用程序在多次迭代后速度变慢

performance - 成为更好/更高效的 PLC 程序员

python - 展平列表列表,用特定值替换空子列表

python 列表理解无效的语法,而 if 语句

python - 错误空间子集和 PostGIS 数据库

python - 正则表达式匹配股票代码

python - 如何检查字符串是否是 pangram?

python - 具有多个条件的字典的逆模糊匹配