为了账号安全,请及时绑定邮箱和手机立即绑定

使用DictReader节省内存开销

使用DictReader节省内存开销

繁花不似锦 2021-03-06 11:08:08
我用来csv.DictReader从CSV文件读取数据。遍历阅读器后,它会产生字典,其中包含从CSV标头中提取的键以及每行的值:with open(filename) as h:    data = csv.DictReader(h)    for row in data:        # row is dict每行是带有键的字典,每行具有完全相同的键。如果值是整数并且键(字符串)很长,则键比值占用更多的存储空间。是否可以按照每行的键指向键的相同实例的方式来对行进行迭代,以便节省每行的内存空间?请注意,我不预先知道按键-它们是从CSV标头中提取的。否则我可以使用namedtuple或__slots__
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您可以使用namedtuple; 自己从第一行构建它:


with open(filename, 'rb') as h:

    data = csv.reader(h)

    headers = next(data)

    RowTuple = namedtuple('RowTuple', headers)

    for row in data:

        row = RowTuple(row)

本质上就是DictReader()这样。从第一行拿钥匙。


请注意,DictReader()代码使用来创建字典dict(zip(self.fieldnames, row));这将为每行重复使用相同的字符串,并且唯一的内存开销是dict表本身加上键的哈希值(这些值每次都会重新计算并缓存)。不会为每一行重新创建键的字符串。该namedtuple方法也不是,但是由于__slots__使用了哈希,因此不需要保留哈希。


查看完整回答
反对 回复 2021-03-27
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信