Python搜索循环缓慢

时间:2016-02-06 16:00:50

标签: python search

我正在搜索广告列表(adscrape)。每个广告都是adscrape中的一个词组(例如下面的广告)。它搜索ID列表(database_ids),其长度可能在200,000到1,000,000之间。我想在adscrape中找到任何没有在database_ids中有ID的广告。

我目前的代码如下。这需要一个漫长的时间,每个广告需要多秒才能扫描database_ids。是否有更有效/更快的方式来运行(查找大列表中的哪些项目,在另一个大列表中)?

database_ids = ['id1','id2','id3'...]
ad = {'body': u'\xa0SUV', 'loc': u'SA', 'last scan': '06/02/16', 'eng': u'\xa06cyl 2.7L ', 'make': u'Hyundai', 'year': u'2006', 'id': u'OAG-AD-12371713', 'first scan': '06/02/16', 'odo': u'168911', 'active': 'Y', 'adtype': u'Dealer: Used Car', 'model': u'Tucson Auto 4x4 ', 'trans': u'\xa0Automatic', 'price': u'9990'}

for ad in adscrape:
    ad['last scan'] = date
    ad['active'] = 'Y'
    adscrape_ids.append(ad['id'])
    if ad['id'] not in database_ids:
        ad['first scan'] = date
        print 'new ad:',ad
        newads.append(ad)

2 个答案:

答案 0 :(得分:0)

`你可以使用列表推导作为下面给出的代码库。使用上面给出的现有database_ids列表和adscrape dict。

代码库: new_adds_ids = [广告中的广告广告,如果广告[' id']不在database_ids中]`

答案 1 :(得分:-1)

您可以将ids_map构建为dict,并通过访问该ids_map中的键来检查列表中的ID是否如下面的代码段中所示:

database_ids = ['id1','id2','id3']
ad = {'id': u'OAG-AD-12371713', 'body': u'\xa0SUV', 'loc': u'SA', 'last scan': '06/02/16', 'eng': u'\xa06cyl 2.7L ', 'make': u'Hyundai', 'year': u'2006', 'first scan': '06/02/16', 'odo': u'168911', 'active': 'Y', 'adtype': u'Dealer: Used Car', 'model': u'Tucson Auto 4x4 ', 'trans': u'\xa0Automatic', 'price': u'9990'}

#build ids map
ids_map = dict((k, v) for v, k in enumerate(database_ids))

for ad in adscrape:
    # some logic before checking whether id in database_ids
    try:
        ids_map[ad['id']]
    except KeyError:
        pass
    else:
        #error not thrown perform logic for existed ids
        print 'id %s in list' % ad['id']