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



>我有以下代码

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

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

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

首先,您可以通过将所有这些作业列表替换为作业集来加快速度。您向我们展示的代码根本不需要更改,它只会神奇地变得更快,因为对集合的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任何东西,因为动态查找其元素的速度与使用您正在预计算的值一样快。

最新更新