2014-12-03 37 views
0

我有以下代码优化检查在字典词汇表

for key,value in jobs.items(): 
    job = key 
    jobVector[key] = [] 
    for x in range (0, len(listOfWords)): 
     if listOfWords[x] in jobs[job]: 
      jobVector[key].append(1) 
     else: 
      jobVector[key].append(0) 

我有一个字典,工作,其具有存储的各种单词和每个计数。伯爵在这种情况下不相关的,但可以说,就业是喜欢本作的关键之一:

jobs[1] = account, addit, allow, ascertain, associ, avail, career, cellular, chang, coasttocoast, commiss, compani, competit, comput, countri, coupl, credit, custom, demand, develop, driven, dynam, employ, enjoi, ethic, exist, expand, experienc, fastest, flexibl, greet, growth, highperform, independ, individu, internet, knowledg, maintain, market, monitor, opportun, order, outstand, payment, person, phone, place, price, privatelyown, process, product, profession, provid, purchas, pursu, receiv, recommend, repres, resolv, respons, retail, right, selfmotiv, specif, store, support, technolog, territori, thatll, throughout, total, train, uniqu, unpreced, wireless, account, addit, aptitud, avail, bartend, benefit, bestbui, bilingu, cellular, colleg, commiss, commun, comput, consult, cross, custom, dedic, deduct, dental, direct, disabl, discount, effect, enterpris, entir, entrepreneuri, excel, execut, extend, famili, fleet, flexibl, goalori, health, impress, individu, insid, insur, integr, interperson, keyword, liter, longterm, medic, member, negoti, offer, outsid, packag, period, person, pleas, possess, possibl, pound, prefer, prescript, proud, provid, recogn, rentacar, repres, respons, retail, retir, salesman, salesperson, saleswoman, satisfi, shield, shortterm, spanish, spend, spirit, sprint, stand, technic, therefor, tmobil, vehicl, verbal, visit, websit, wireless, wwwjoincellularsalescom 

可以说listOfWords是这样的:

listOfWords = associ, avail, career, cellular, chang, coasttocoast, commiss, compani, competit, comput, countri, coupl, credit, custom, demand, develop, driven, dynam, employ, enjoi, ethic 

我非常想通过每单词在listOfWords中,看看它是否存在于JOBS字典中的每个作业的单个作业中。如果存在,则存储1,否则将0存储到另一个字典中。

他们有什么办法来加速?它目前有效,但在15000个作业的数据集上需要大约3分钟的时间。

+0

只要有可能,请用集合替换列表。集合可以快速地进行成员资格测试(即'如果some_set中的某些东西')。列表必须一次遍历每个元素。 – Kevin 2014-12-03 01:26:33

回答

1

首先,您可以通过将所有这些作业列表替换为一组作业来加快速度。您向我们展示的代码将不会有任何改变,它只会神奇地变得更快,因为一个集合的in测试几乎是即时的,而列表的in测试必须检查列表中的每个值名单。


您还可以得到一些小的加速和大可读性增益与直接循环替换range循环,使用value而不是重新寻找它,并转动整个循环到理解:

for key, value in jobs.items(): 
    jobVector[key] = [1 if word in value else 0 for word in listOfWords] 

甚至:

jobVector = { 
    key: [1 if word in value else 0 for word in listOfWords] 
    for key, value in jobs.items() } 

此外,如果这就是Python 2.x中,使用viewitems(如果你不需要2.6或更早版本)或iteritems(如果你这样做)而不是items


但实际上,除了有一套的使用列表,我怀疑有一个与你的数据结构一个更大的问题。不知道你在尝试使用这些东西,但很难确定,但我怀疑你可以通过使用另一个字典来更清晰,更快速地完成任务,从而关闭单个作业,因此您可以立即查看它们,而不是彻底搜索。

如果各职业只能属于一个工作(这里你的术语是让人有些困惑,顺便......),这仅仅是一个字典映射每个人的工作,其父:

d = {ijob: job for job, ijobs in jobs.items() for ijob in ijobs} 

如果每个个人工作可以属于多个就业岗位,就需要每个映射到组作业属于:

d = collections.defaultdict(set) 
for job, ijobs in jobs.items(): 
    for ijob in jobs: 
     d[ijob].add(job) 

然后好像你并不真的甚至需要jobVector任何东西,因为它会为快速查找它的元素,以使用va因为你在预先计算。