在 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]
。
我一直在研究一种无-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]
。