我目前正在使用此代码进行比较并制作一个新数组,当时键的值为' time' list1和list2都是一样的:
open
但是,如果两个列表都有例如每个超过6000个项目,则处理时间过长。有办法让它更快吗?
在这种情况下,我可以使用Numpy来提高速度吗?
修改
一个例子:
def innerJoin(self, list1, list2):
mergedList = []
for i in range(len(list1)):
for j in range(len(list2)):
if (list1[i]['time']==list2[j]['time']):
mergedList.append(list2[j])
return mergedList
它应该返回:
list1 =[{
'time': '2017-07-03T01:12:13Z',
'tag': 'TEMP',
'value': 34.5
},{
'time': '2017-07-03T01:12:17Z',
'tag': 'TEMP',
'value': 34
}]
list2 =[{
'time': '2017-07-03T01:12:13Z',
'tag': 'VOLUME',
'value': 3
}]
我不需要'标记'和'代码',所以如果这样的回报没问题:
mergedList =[{
'time': '2017-07-03T01:12:13Z',
'tag': 'VOLUME',
'value': 3
}]
答案 0 :(得分:4)
你可以尝试这些方法:
def innerJoin(list1, list2):
set1 = set(l['time'] for l in list1)
return [l for l in list2 if l['time'] in set1]
或者您可以使用过滤器:
...
return filter(lambda i: i['time'] in set1, list2)
答案 1 :(得分:2)
你可以用它。它的速度要快得多:
def innerJoin(list1, list2):
mergedList = []
# Of course you can skip the sorting if you know that they are sorted
# but it is much faster even if you sort first
l1 = sorted(list1, key=lambda s:s['time'])
l2 = sorted(list2, key=lambda s:s['time'])
i1=0
i2=0
while(i1 < len(l1) and i2 < len(l2)):
if (l1[i1]['time']==l2[i2]['time']):
mergedList.append(l2[i2])
i1=i1+1
i2=i2+1
else:
if (l1[i1]['time']<l2[i2]['time']):
i1=i1+1
else:
i2=i2+1
return mergedList
你的算法是O(n²),而我的算法是O(n)。排序可能是O(n * log n)。来自knipknap的解决方案通常更好用,但我认为这个答案可以很好地理解选择的算法如何影响性能。
我尝试了n = 3,000,000。当我不得不对列表进行排序时,需要10秒钟,如果我预先分配它需要3.2秒。
我想指出您的代码可能有错误,具体取决于您是否要将其视为错误。如果其中一个列表中有双联,您将在返回的列表中获得双联。我不知道你是否有这样的想法,但事实就是如此。我花了大约一小时才意识到我的代码没有错。 :)
如果您想使用我的代码并且想要该功能,则必须对其进行修改。