【发布时间】:2017-07-06 03:17:03
【问题描述】:
def fancymatching(fname1, fname2):
#This function will do much smarter and fancy kinds of compares
if (fname1 == fname2):
return 1
else:
return 0
personlist = [
{
'pid':'1',
'fname':'john',
'mname':'a',
'lname':'smyth',
},{
'pid':'2',
'fname':'john',
'mnane':'a',
'lname':'smith',
},{
'pid':'3',
'fname':'bob',
'mname':'b',
'lname':'nope',
}
]
for person1 in personlist:
for person2 in personlist:
if person1['pid'] >= person2['pid']:
#don't check yourself, or ones that have been
continue
if fancymatching(person1['fname'], person2['fname']):
print (person1['pid'] + " matched " + person2['pid'])
我正在尝试改进上述代码的想法。它可以工作,但如果 personlist 变得非常大(比如数百万),我觉得肯定有比 2 个 for 循环更快的东西。
代码所做的是获取一个字典列表,并对每个字典的值与其他字典运行一个花哨的模糊匹配函数。因此,这并不像将所有字典与其他字典进行比较那么简单。我想要一种在每个字典上运行一个函数的方法,也许 2 个 for 循环是正确的方法吗?任何建议都会有所帮助!
【问题讨论】:
-
如果对模糊匹配一无所知,则无法比嵌套循环更快地执行此操作(但是,如果您的第二个循环从
person1的下一个开始迭代,则可以将其提高 2 倍。这样,如果(a,b)已评估(b,a)未评估。匹配是否具有传递性? -
使用
itertools.combinations可能比写出你自己的循环快一点,但不会快很多(同样的O(N**2)渐近性能)。
标签: python performance list dictionary for-loop