python生成器可以像字典一样工作吗?



我在Excel电子表格中列出了大量的公司信息。我需要将公司信息引入我的程序进行处理。

每个公司都有一个用于访问公司的唯一标签。我可以使用标签作为键和公司信息作为值来创建字典,例如 {label1: company1, label2: company2, ...} .通过这样做,当创建字典时,它会消耗太多内存。

是否可以创建一个可以像字典一样使用的生成器?

这个问题的主要目标似乎是拥有一个行为类似于字典的对象,而没有字典的内容在RAM中(OP:"通过这样做,当字典被创建时,它会消耗太多内存。这里的一个选择是使用sqlitedict,它模仿Python字典API,并在后台使用Sqlite数据库。

下面是当前文档中的示例:

>>> # using SqliteDict as context manager works too (RECOMMENDED)
>>> with SqliteDict('./my_db.sqlite') as mydict:  # note no autocommit=True
...     mydict['some_key'] = u"first value"
...     mydict['another_key'] = range(10)
...     mydict.commit()
...     mydict['some_key'] = u"new value"
...     # no explicit commit here
>>> with SqliteDict('./my_db.sqlite') as mydict:  # re-open the same DB
...     print mydict['some_key']  # outputs 'first value', not 'new value'

您可以创建一个类来重写 __getitem__ 方法。喜欢:

class Foo:
    def __getitem__(self,key):
        # ...
        # process the key
        # for example
        return repr(key)

现在,如果您创建一个Foo

>>> somefoo = Foo()
>>> somefoo['bar']
"'bar'"
>>> somefoo[3]
'3'

所以在语法上,它"有点"像字典。

您也可以使用带有send生成器,如以下答案所示:

def bar():
    while True:
        key = yield
        # process the key
        # for example
        yield repr(key)

并调用它:

>>> somebar = bar()
>>> next(somebar)
>>> somebar.send('bar')
"'bar'"
>>> next(somebar)
>>> somebar.send(3)
'3'

假设您面临的问题是从 csv 文件访问键值结构化数据,您有 3 个选项:

  1. 将整个数据加载到字典中,将其作为一个整体复制到RAM中,然后具有快速,恒定的访问时间。这就是你说要避免的。
  2. 每次要按键访问数据时,逐行搜索数据。这没有任何内存开销,但每次都需要扫描整个文档,具有线性访问时间。
  3. 使用数据或将数据复制到某个数据库引擎(或任何键值存储(中,该引擎支持基于磁盘的索引,允许恒定时间访问,同时不需要先将数据加载到内存中。

最新更新