这是可能发生这种情况的原因:
要创建一组独特的自定义对象,您的对象必须至少实现__eq__
和__hash__
.
演示:
class Obj(object):
def __init__(self,val):
self.val=val
def __repr__(self):
return self.val
li=['i am uniq','i am uniq','i am uniq','not really','not really','not really']
print set(Obj(e) for e in li)
印刷
set([i am uniq, i am uniq, not really, not really, i am uniq, not really])
现在添加所需的__eq__
和__hash__
方法:
class Obj(object):
def __init__(self,val):
self.val=val
self.hash=hash(val)
def __repr__(self):
return self.val
def __eq__(self,other):
return self.hash==other.hash
def __hash__(self):
return self.hash
li=['i am uniq','i am uniq','i am uniq','really','really','really']
print set(Obj(e) for e in li)
印刷:
set([i am uniq, really])
如果没有适当的哈希和 eq,您会发现根本没有集合;您将拥有一个基于Jobs
obj id 的无序列表。换句话说,对于 Python,即使您定义为“相同”的对象也会被视为不同的对象,因为每个对象都有不同的 obj id。这个“集合”实际上会比等效列表大得多。
除此之外——一种更节省内存的方法可能是在 numpy 中使用结构化数组和生成器来逐行读取文件。
战略:
- 打开文件
- 确定文件的总行数——即文件中最坏情况的总记录数
- 倒带文件
- 读取第一条记录并根据行数据的记录(整数、浮点数、字节等)确定 numpy 数组的最有效记录结构这比 Python 对象中的等效数据要密集得多
- 倒带文件
- 如果您想要一个哈希来统一您的数据,请将其添加到记录中
- 将numpy数组预先分配给
lines X records
大小
- 创建一个生成器以逐行读取文件并将每条记录放在 numpy 数组中
- 不要添加重复记录(基于哈希)
- 为未添加的总重复记录调整 numpy 数组的大小...