Python 嵌套惰性列表
Posted
技术标签:
【中文标题】Python 嵌套惰性列表【英文标题】:Python nested lazy lists 【发布时间】:2018-06-02 08:31:51 【问题描述】:我正在尝试使用 matplotlib 绘制二维图像,它需要嵌套列表格式的数据点。我有一种非常简洁、惯用的方式来生成这个:
zs = [[cost_at(x, y) for x in x_range] for y in y_range]
plt.contourf(x_range, y_range, zs, 1000)
它适用于小数据。但是,我现在需要做完全相同的事情,除了 X 和 Y 的范围太大而无法将完整的嵌套列表放入内存中。在我看来,如果库通过迭代器访问它们,那么应该可以使用惰性列表调用 API,这有望成为足够的替代品。
除了惰性列表之外,还有什么方法可以完成上述操作?
【问题讨论】:
嵌套列表会发生什么?它走得很慢吗?所以你基本上想优化执行时间? @J.C.Rocamonde X 和 Y 范围太大,整个嵌套列表无法放入内存 “在我看来应该可以使用惰性列表调用 API”——plt.contourf()
的文档是怎么说的?
列表理解的惰性版本将是等效的生成器表达式!
为了生成等高线图,必须立即知道所有数据。虽然从技术上讲,当然可以编写一个轮廓算法来处理当前计算区域周围的部分数据,但这并不是 matplotlib 在内部的工作方式。同样在这样的算法中,您将无法处理数据的行和列。话虽如此,创建等高线图的方法是提供一个 numpy 数组。如果 numpy 数组对于内存来说太大了,将数组智能拼接成更小的部分可能是一种方法。
【参考方案1】:
在 Python 中,可以使用生成器表达式创建“惰性列表”:
zs = ((cost_at(x, y) for x in x_range) for y in y_range)
通过使用圆括号代替方括号,您可以创建一个嵌套的生成器表达式,它一次提供一个cost_at(x, y)
,而不是一次计算它们。
【讨论】:
完美解决方案!作为记录, plt.contourf 遗憾地证明不接受生成器,但这对于其他上下文仍然是一个很好的解决方案。谢谢! 接受一个最终不起作用的答案不是很令人困惑吗?这样未来的读者会认为他们可以使用生成器通过 matplotlib 绘制等高线图 - 事实并非如此。 @ImportanceOfBeingErnest 这就是我添加该评论的原因。这不像我期待一个适用于 matplotlib 的替代答案。以上是关于Python 嵌套惰性列表的主要内容,如果未能解决你的问题,请参考以下文章