优化词典和列表中单词的检查

时间:2014-12-03 01:20:08

标签: python for-loop optimization dictionary

我有以下代码

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,其中存储了各种单词并且每个单词都有计数。在这种情况下,计数是无关紧要的,但是让我们说其中一个键的作业是这样的:

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 dict中每个作业的单个作业中。如果存在,则存储1,否则将0存储到另一个字典中。

他们有什么方法可以加快速度吗?它目前有效,但在15000个作业的数据集上大约需要3分钟。

1 个答案:

答案 0 :(得分:1)

首先,您可以通过用作业集替换所有这些作业列表来加快速度。你向我们展示的代码根本不需要改变,它只会神奇地变得更快,因为对一组的in测试几乎是即时的,而对{a}}的in测试list必须检查列表中的每个值。


你也可以通过直接循环取代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来做任何事情,因为它可以快速查找其元素,以便使用你预先计算的值。