我在python中有一个大小约250k的字典列表(即列表中的250k字典),我尝试处理如下所示。目的是clean up
字典并在结尾返回一个iterable。所以,我有这样的事情:
def check_qs(dict_list_in):
try:
del_id=[]
for i in dict_list_in:
tmp=i["get_url"][0]
if i["from"][0]=="var0":
try:
URLValidator()(tmp)
except:
del_id.append( i["id"] )
elif i["from"][0]=="var1":
try:
URLValidator()( tmp.split("\"")[1] )
except:
del_id.append( i["id"] )
elif i["from"][0]=="var2":
try:
URLValidator()( tmp.split("\'")[1] )
except:
del_id.append( i["id"] )
else:
del_id.append( i["id"] )
gc.collect()
result = filter(lambda x: x['id'] not in del_id,dict_list_in)
return result
except:
return dict_list_in
我上面正在做的是检查列表中的每个字典是否存在某些情况,如果是fails
,我会得到id
,然后使用filter
删除特定的字典从列表中。
目前,这需要很长时间才能运行 - 我想知道是否有任何明显的优化我错过了。我认为目前上面的代码太天真了。
答案 0 :(得分:0)
我做了一些改变。我将验证实例放在循环之外,这样您就不必每次都初始化它。如果每次都需要实例化,只需将其移动到try accept块中即可。我还更改了删除原始列表中的项目,将项目附加到您想要的新列表,从而无需过滤器。我还将验证移出了if语句,这样如果你点击else语句,你就不必运行验证。看看if语句的逻辑,它和你的一样。您似乎正在使用django,但如果您没有将except
更改为except Exception
。
from django.core.exceptions import ValidationError
def check_qs(dict_list_in):
new_dict_list = []
validate = URLValidator()
for i in dict_list_in:
test_url = i["get_url"][0]
if i["from"][0] == "var0":
pass
elif i["from"][0] == "var1":
test_url = test_url.split("\"")[1]
elif i["from"][0] == "var2":
test_url = test_url.split("\'")[1]
else:
continue
try:
validate(test_url)
# If you aren't using django you can change this to 'Exception'
except ValidationError:
continue
new_dict_list.append(i)
return new_dict_list