Python 如何有效地比较两张地图?
我需要比较两张地图,我正在寻找最好的方法。特别是,给定输入中的两个映射,我需要确定它们的条目中是否至少有80%是相同的。目前的做法是: -数据以键->值的形式存储在两个文件中 例如: 1.1.1.0/24 | 178 188 198 1.1.2.0/24 | 199 2212 2999 212 该文件中存储了大约600K个条目 -条目上载到地图中,然后执行比较 由于数据量巨大,执行速度非常慢。(我需要多次进行这种比较)。我甚至不知道地图是否是最好的数据结构。考虑到2个文件中的条目数目可能不同(有些在第一个文件中可能不存在于第二个AMD中,反之亦然),并且文件中的条目按字母顺序排序。我正在使用Python 两种不同的方法: 1) 上传到包含元组的集合后,将按如下方式执行比较:Python 如何有效地比较两张地图?,python,algorithm,performance,data-structures,Python,Algorithm,Performance,Data Structures,我需要比较两张地图,我正在寻找最好的方法。特别是,给定输入中的两个映射,我需要确定它们的条目中是否至少有80%是相同的。目前的做法是: -数据以键->值的形式存储在两个文件中 例如: 1.1.1.0/24 | 178 188 198 1.1.2.0/24 | 199 2212 2999 212 该文件中存储了大约600K个条目 -条目上载到地图中,然后执行比较 由于数据量巨大,执行速度非常慢。(我需要多次进行这种比较)。我甚至不知道地图是否是最好的数据结构。考虑到2个文件中的条目数目可能不同(
def checkSame(bgpt1, bgpt2):
size1 = len(bgpt1)
size2 = len(bgpt2)
num_shared_ip = float(len(bgpt1 & bgpt2))
ratio = num_shared_ip / max(size1, size2)
return ratio
2) 使用映射,通过迭代执行比较:
def compareMaps(map1,map2):
counter=0
for keyM1 in map1:
if keyM1 in map2:
if map2[keyM1]==map1[keyM1]:
counter+=1
...
既然你没有发布代码,我可以试着提出一些想法 也许您可以尝试删除这两个文件,然后将每一行与下一行进行比较(这需要每个文件都有一个唯一的密钥)。对于每一次点击,你可以将计数器更新一次,当你到达文件端时,你用行数除以得到相似性 另一个想法是计算Jaccard相似性,但这要求每个文件都有唯一的值,并且数据适合内存。读取两个文件中的所有值并创建(key:value)字符串集。(Set表示每个值的基数为一)。然后您可以使用此功能:
def compute_jaccard_index(set_1, set_2):
n = len(set_1.intersection(set_2))
return n / float(len(set_1) + len(set_2) - n)
返回两个集合的相似程度的标准化索引[0-1]
编辑:刚刚看到您发布的代码。试试我建议的元组集。您还可以使用其中一个,因为您的文件已排序,您不必存储它们,甚至不必在行外解析它们。您可以使用较小的当前元素按顺序继续前进:
def count_equal(a, b):
"""
Counts the number of values that are equal in two sorted iterables.
>>> odds = [1, 3, 5, 7, 9, 11, 13, 15]
>>> primes = [2, 3, 5, 7, 11, 13]
>>> count_equal(odds, primes)
5
"""
return _count_equal(iter(a), iter(b))
def _count_equal(a, b):
c = 0
x = next(a)
y = next(b)
try:
while True:
while x < y:
x = next(a)
while y < x:
y = next(b)
if x == y:
c += 1
x = next(a)
y = next(b)
except StopIteration:
return c
请显示您当前方法的代码。刚刚编辑。无论如何,我不需要执行,只需要了解如何提高性能什么是“非常慢”以及什么是可接受的时间量?它必须更有效,无需考虑时间
return num_shared_ip/max(size1,size2)
使用的CPython操作码少于ratio=num\u shared\u ip/max(大小1,大小2);回报率
。这就对了——效率更高,只是。(是的,你需要解释一下时间,我不是无缘无故地问这个问题。)简单的合并获胜!
from __future__ import division
class CountingIterable:
def __init__(self, iterable):
self.iterable = iterable
def __iter__(self):
count = 0
for x in self.iterable:
yield x
count += 1
self.count = count
with open('file1.txt', 'r') as a, open('file2.txt', 'r') as b:
a_counter = CountingIterable(a)
b_counter = CountingIterable(b)
a_iterator = iter(a_counter)
b_iterator = iter(b_counter)
n = count_equal(a_iterator, b_iterator)
# consume any remaining elements to acquire count
for _ in a_iterator: pass
for _ in b_iterator: pass
result = n / max(a_counter.count, b_counter.count)