假设我有一个非常大的整数,大约为 10**200。现在将整数存储在文件中会占用一些空间。
如果我使用 将它转换为迭代器yield
,我可以将迭代器存储在文件中吗?这会节省任何资源吗?
迭代器可以像这样生成:
def rec():
for i in range(0,10**200):
yield i
iterable = rec()
假设我有一个非常大的整数,大约为 10**200。现在将整数存储在文件中会占用一些空间。
如果我使用 将它转换为迭代器yield
,我可以将迭代器存储在文件中吗?这会节省任何资源吗?
迭代器可以像这样生成:
def rec():
for i in range(0,10**200):
yield i
iterable = rec()
我假设这是你想做的:
def f():
yield 10**200
然后保存f()
在一个文件中。答案是否定的,那是行不通的。除非您将其转换为具有特殊用途的酸洗支持的自定义迭代器,否则像f()
(注意:这是生成器,不可迭代)这样的生成器不能被酸洗或以其他方式序列化。
基于larsmans的回答,可以构建一个自定义迭代器来执行此操作:
class my_large_num(object):
def __init__(self):
self.num_iterations = 0
def __iter__(self):
return self
def next(self):
if self.num_iterations < 1:
self.num_iterations += 1
return 10**200
else:
raise StopIteration()
然后您可以:
import pickle
pickled_repr = pickle.dumps(my_large_num())
restored_object = pickle.loads(pickled_repr)
sum(restored_object)
这是有效的,因为在下面,可迭代对象有一个在完成时next()
引发的函数StopIteration
。我们所做的只是创建一个实现此功能的类。
在这种特定情况下,无论您是否将类存储在文件中,您仍然需要执行迭代并因此存储10**200
在内存中,因此除了按需生成数字外,您没有任何功能,您无需序列化即可完成物体。
您可能正在考虑mmap样式的空间节省。这会将内存映射到文件 - 请注意,但这仍然会影响程序的可用内存。
值 10**200 的整数不会占用大量空间。以 10 基 ASCII 编码,只需要 201 个字符。如果您愿意以二进制形式存储数据,那么您只会看到 85ish
如果您的意思是“可迭代”,那也没有多大意义-可迭代本质上是一个函数,并且您已经保存了该函数-它在源文件中。