我使用csv.DictReader
从CSV文件中读取数据。当迭代读取器时,它会产生字典,其中包含从CSV标头获取的键和每行的值:
with open(filename) as h:
data = csv.DictReader(h)
for row in data:
# row is dict
每一行都是keys的字典,每行的键完全相同。如果值是整数并且键(字符串)很长,则键占用的内存空间比值大..
我可以按照每行键指向相同实例键的方式迭代行,这样每行节省一些内存空间吗?
请注意,我事先并不知道密钥 - 它们来自CSV标头。否则,我可以使用namedtuple
或__slots__
答案 0 :(得分:2)
你可以使用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__
使用以来不需要保留哈希值。