在 Python 中更快地搜索 - 邮政编码

Faster searching in Python - Postcodes

我一直在研究一种无-sql 解决方案,以使用国家邮政编码列表命名 N 个邮政编码列表。到目前为止,我有新南威尔士州的参考词典,格式为:

{'Belowra': 2545, 'Yambulla': 2550, 'Bingie': 2537, ... [n=4700]

我的 函数使用它来查找邮政编码的名称:

def look_up_sub(pc, settings):
    output=[]
    for suburb, postcode in postcode_dict.items():
        if postcode == pc and settings=='random':#select match at random
            print(suburb)                        #remove later
            output.append(suburb)
            break                                #stop searching for matches
        elif postcode == pc and settings=='all': #print all possible names for postcode
            print(suburb)                        #remove later
    return output 

N=[2000,2020,2120,2019]
for i in N:
    look_up_sub(i, 'random')

>>>Millers Point
>>>Mascot
>>>Westleigh
>>>Banksmeadow

虽然对于小列表没问题,但当 N 足够大时,这种低效的方法非常慢。我一直在考虑如何使用 numpy 数组来显着加快速度,并且正在寻找更快的方法来解决这个问题。

你的数据结构是倒退的,它应该从 postcode:suburb 开始,然后当你将它传递给 pc 时,你会得到一个郊区列表,然后从该列表中随机选择 select 或打印所有他们在列表中。 这是你应该做的,首先,反转你的命令:

import defaultdict
post_to_burb = defaultdict(list)
for suburb, postcode in postcode_dict.items():
    post_to_burb[postcode].append(suburb)

现在,您的函数应该执行如下操作:

import random
def look_up_sub(pc, settings):
    output = []
    if settings == "random":
        output.append(random.choice(post_to_burb[pc]))
    elif settings == 'all':
        output.extend(post_to_burb[pc])
    return output

在这里使用 numpy 会很笨拙,尤其是因为您正在处理字符串。您可能会在运行时得到一些边际改进,但您的整体算法仍将是线性时间。现在是恒定时间,一旦你设置了你的 post_to_burb 字典。

构建从邮政编码到郊区的字典:

from collections import defaultdict
code_to_urbs = defaultdict(list)
for suburb, postcode in postcode_dict.items():
    code_to_urbs[postcode].append(suburb)

完成后,您可以写 code_to_urbs[postal_code]