-3

假设我有一个非常大的整数,大约为 10**200。现在将整数存储在文件中会占用一些空间。

如果我使用 将它转换为迭代器yield,我可以将迭代器存储在文件中吗?这会节省任何资源吗?

迭代器可以像这样生成:

def rec():
  for i in range(0,10**200):
    yield i

iterable = rec()
4

4 回答 4

2

我假设这是你想做的:

def f():
    yield 10**200

然后保存f()在一个文件中。答案是否定的,那是行不通的。除非您将其转换为具有特殊用途的酸洗支持的自定义迭代器,否则像f()(注意:这是生成器,不可迭代)这样的生成器不能被酸洗或以其他方式序列化。

于 2012-11-04T16:38:53.233 回答
1

您可以使用Shelve模块来存储它。

“架子”是一个持久的、类似字典的对象。与“dbm”数据库的区别在于架子中的值(不是键!)本质上可以是任意的 Python 对象——pickle 模块可以处理的任何东西。

以下类型可以腌制

于 2012-11-04T16:39:00.233 回答
1

基于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样式的空间节省。这会将内存映射到文件 - 请注意,但这仍然会影响程序的可用内存。

于 2012-11-04T16:54:48.690 回答
0

值 10**200 的整数不会占用大量空间。以 10 基 ASCII 编码,只需要 201 个字符。如果您愿意以二进制形式存储数据,那么您只会看到 85ish


如果您的意思是“可迭代”,那也没有多大意义-可迭代本质上是一个函数,并且您已经保存了该函数-它在源文件中。

于 2012-11-04T16:35:41.247 回答