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