查看numpy OrderedDict中的值是否与另一个OrderedDict中的值相同的最快方法是什么?

时间:2019-04-24 15:22:32

标签: python python-3.x numpy numpy-ndarray

我试图确定在不同的numpy orderdict对象中保存的两个值是否相同。

两个字典都是通过使用fetchallnumpy()中的turbodbc选项创建的,并且由两个键组成。第一个键是一个id字段,第二个键是一个可变长度的字符串值。我想看看第二组字典项中是否存在第一组字典项中的字符串值。

可能值得注意的是,两个字典对象在每个键下都拥有大约6000万个值。

到目前为止,我已经尝试了几种方法:-

  1. np.isin(dict1[str_col],dict2[str_col])

    作为函数,但这非常慢,大概是因为字符串值存储为dtype对象。

  2. 我尝试将两个字典对象都转换为具有显式字符串类型为numpy的{​​{1}}数组,然后尝试使用np.asarray(dict1[str_col], dtype='S500')isin函数。此时,系统用完了RAM。已将“ S500”换成in1d,但仍然得到dtype=np.string_MemoryError,同时执行(ar=np.concatenate((ar1,ar2)))功能。

  3. 我也尝试了for循环。

    isin

    同样,这非常慢。

  

我的目的是要有一种相对快速的方法来测试两个字符串   列而不会用完内存。

其他位  从长远来看,当我试图识别>新值和已更改的值时,我将运行多个检查。

字典A =当前数据['ID':[int,int,int]]  字典B =历史数据['record':[str,str,str]]

所以我感兴趣的是:-

  • A!= B(当前记录与历史记录不同)
  • B中不存在A(已将新记录添加到数据库中)
  • A中不存在B(需要删除记录)

到目前为止,我发现的最快的最后两个元素是将id列传递给包含np.isin(arr1,arr2)的函数。平均需要15秒才能比较数据。

2 个答案:

答案 0 :(得分:0)

您可以使用np.searchsorted进行更快的搜索:

ar1 = dict1[str_col]
ar2 = dict2[str_col]
sorter = np.argsort(ar2)
idx = np.searchsorted(ar2, ar1, sorter=sorter)
if idx.max() >= len(ar2):
    return False
return np.all(ar1 == ar2[sorter[idx]])

答案 1 :(得分:0)

仍然不能完全清楚您要达到的目标(请参阅我的评论)。但是,这是我的短裤。

Pandas可能会提供一种更有效的方法来比较字符串列表。自己还没有测试过大块数据。

尝试以下操作:

import pandas as pd
s1 = pd.Series(dict1[str_col])
s2 = pd.Series(dict2[str_col])
print(s1.isin(s2).all())

或者如果仍然需要遍历所有列,则可以将完整的字典转换为数据框:

df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
for col in df1:
    print(df1[col].isin(df2[col]).all())

如果要测试整个DataFrame的相等性,可以使用pandas的assert_frame_equal。例如:

 pd.util.testing.assert_frame_equal(df1, df2)     
 # ...or if the ordering is not the same.
 pd.util.testing.assert_frame_equal(df1, df2, check_like=True)

显然,可以将turbodbc数据直接转储到熊猫对象(to_pandas())中。看到这里:turbodbc documentation, advanced usage