python 中用于清空列表和追加的内存高效替代方案?
Memory-efficient alternatives in python to empty list and append?
我在 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
但是,我不确定它在上面的示例中是如何工作的,因为除了使用列表之外,我不知道如何将项目存储在这样的数据结构中。
有什么替代方法可以将项目存储在像这样的庞大列表中?
以下是创建生成器函数以高效地迭代内存中一次只有一个对象的方法:
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)
我在 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
但是,我不确定它在上面的示例中是如何工作的,因为除了使用列表之外,我不知道如何将项目存储在这样的数据结构中。
有什么替代方法可以将项目存储在像这样的庞大列表中?
以下是创建生成器函数以高效地迭代内存中一次只有一个对象的方法:
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)