猿问

使用DictReader节省内存开销

我用来csv.DictReader从CSV文件读取数据。遍历阅读器后,它会产生字典,其中包含从CSV标头中提取的键以及每行的值:


with open(filename) as h:

    data = csv.DictReader(h)

    for row in data:

        # row is dict

每行是带有键的字典,每行具有完全相同的键。如果值是整数并且键(字符串)很长,则键比值占用更多的存储空间。


是否可以按照每行的键指向键的相同实例的方式来对行进行迭代,以便节省每行的内存空间?


请注意,我不预先知道按键-它们是从CSV标头中提取的。否则我可以使用namedtuple或__slots__


繁花不似锦
浏览 174回答 1
1回答

杨魅力

您可以使用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__使用了哈希,因此不需要保留哈希。
随时随地看视频慕课网APP

相关分类

Python
我要回答