【问题标题】:Memory-efficient alternatives in python to empty list and append?python中用于清空列表和追加的高效内存替代方案?
【发布时间】:2020-07-02 05:31:58
【问题描述】:

我在 python 中使用了一个相当大的数据集,并且使用列表的内存效率太低。

伪代码如下:

thelist = []
for x in range(N):
    value = function_call()
    thelist.append(value)

more = separate_function_call()

thelist.append(more)

我执行初始化空列表的标准方法,然后使用对函数调用的迭代以及单独函数调用的输出将项目附加到此列表。

我的问题是列表太大而无法放入内存。

通常,这对于生成器来说是一个明显的例子,例如

import sys
list_comp = [x ** 2 for x in range(5000) if x % 2 == 0]
gen_exp = (x ** 2 for x in range(5000) if x % 2 == 0)
sys.getsizeof(list_comp)
## 21040
sys.getsizeof(gen_exp)
## 112

但是,我不确定在上面的示例中这是如何工作的,因为除了使用列表之外,我不知道如何将项目存储在这种数据结构中。

除了将项目存储在这样的大量列表中之外,还有哪些替代方法?

【问题讨论】:

  • 这取决于你需要对列表做什么。两个最明显的选项是您可以一次处理一个结果而不保存它们,或者您可以将结果保存到磁盘。
  • 生成器并不是真正的容器,它是一个迭代器。你实际上打算用这些数据做什么?无论如何,您可以只编写一个生成器函数......您是在问如何编写一个生成器函数吗?但在这种情况下,你不妨已经在 for 循环中处理数据。
  • @kpie 如何将结果保存到磁盘?
  • @juanpa.arrivillaga 我只是将项目存储在下游功能的列表中。如果我以后可以访问它们,那将很有用。
  • @EB2127 对。但是生成器会给你一个迭代器,你能在迭代器上做下游处理吗?生成器并不神奇,它们的内存效率更高,因为它们 不会一次存储所有数据,而是在您对它们进行迭代时生成数据。 IE。正如 kpie 所说,一次对其中一个对象进行操作的选项。

标签: python list memory bigdata generator


【解决方案1】:

以下是您如何创建生成器函数以有效地迭代一次仅在内存中的对象:

def my_generator(N):
    for x in range(N):
        yield function_call()
    yield another_function_call()

for item in my_generator(1000): # or whatever N
    do_stuff(item)

【讨论】:

  • 我认为我的困惑一直在对困难的函数调用产生影响......但我认为这肯定会奏效。感谢您帮助我解决了我对此的困惑!
猜你喜欢
  • 2010-09-24
  • 2011-04-27
  • 2011-10-28
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多