我有一个包含70万项的列表,一本字典包含30万个键。300 k键中的一些包含在列表中存储的700 k项中。现在,我构建了一个简单的比较和处理循环:
# list contains about 700k lines - ids,firstname,lastname,email,lastupdate
list = open(r'myfile.csv','rb').readlines()
dictionary = {}
# dictionary contains 300k ID keys
dictionary[someID] = {'first':'john',
'last':'smith',
'email':'john.smith@gmail.com',
'lastupdate':datetime_object}
for line in list:
id, firstname, lastname, email, lastupdate = line.split(',')
lastupdate = datetime.datetime.strptime(lastupdate,'%Y-%m-%d %H:%M:%S')
if id in dictionary.keys():
# update dictionary[id]'s keys:values
if lastupdate > dictionary[id]['lastupdate']:
# update values in dictionary[id]
else:
# create new id inside dictionary and fill with keys:values
我希望能加快一些速度,并在这种工作中使用多重处理。为此,我认为我可以将列表拆分为四个较小的列表,Pool.map每个列表,并与创建四个新字典的四个进程中的每一个单独检查它们。问题是,为了创建一个包含最后更新值的完整字典,我将不得不使用4个新创建的字典来重复这个过程,等等。
有没有人经历过这样的问题,并对这个问题有一个解决方案或想法?
谢谢
发布于 2013-11-23 03:03:42
if id in dictionary.keys():
不!请不要!这是一个O(n)操作!正确的方法就是简单地
if id in dictionary
这需要O(1)时间!
在考虑使用多处理等之前,您应该避免这种非常低效的操作。如果字典有300 k键,那行可能是瓶颈。
我假设是python2;如果不是这样,那么您应该使用python-3.x。在python3中,使用key in dictionary.keys()
是O(1),因为.keys()
现在返回dict的视图,而不是键列表,但是忽略.keys()
还是要快一些。
发布于 2013-11-18 12:57:22
我认为你应该先不要一遍又一遍地分割每个令牌的相同行:
id, firstname, lastname, email, lastupdate = line.split(',')
lastupdate = datetime.datetime.strptime(lastupdate,'%Y-%m-%d %H:%M:%S')
https://stackoverflow.com/questions/20057250
复制