我在python中遇到了效率问题。 几天来,我现在试图找到并测试不同的实现,但是不能让它足够快地工作。
任务:我有两个列表arr和arr2,其中1000000个条目为b''(使用键“00000000”到“00999999”进行加密和解密) 并且知道必须在这两者中找到匹配(DES2在中间相遇)。因此
if arr[x] == arr2[y]:
return x, y
我认为我的解决方案可行,但速度太慢,还不够:
def g(x):
for k in range(0, 1000000):
if (arr[x] == arr2[k]):
return k, x
return 0
keypair = 0
for k in range(0, 1000000):
if keypair == 0:
keypair = g(k)
else:
break
问题是,密钥对应该在不到40秒的时间内找到,但是例如对于1000000个条目中的1000个,此示例需要1分钟。
现在某种程度上必须提高效率。我尝试了其他一些解决方案,这些解决方案可以提高效率,例如数组的map和numpys解决方案,但速度没有得到任何真正的改善。
您知道任何智能解决方案吗?
答案 0 :(得分:0)
我不确定您是否只对存在感兴趣,或者您需要列表中的索引。该解决方案是关于索引案例。如果您只是需要检查存在,请使用g
作为set
而不是字典,并检查k
中g
中k
的{{1}}是否arr2
}。
如果空间不是问题,请尝试使用字典:
g = {k:i for i,k in enumerate(arr)}
keypair = None
for i,k in enumerate(arr2):
if k in g:
keypair = (i, g[k])
break;
哈希表在查找操作上摊销O(1)。
无论如何写cython并不难(即使使用原生类型),但如果你不改变算法并仍然使用O(n ^ 2)方法,你将失败你的目标。
该方法是O(n),但使用大量内存并且可能是高常量。问题的维度(n=1000000
)应该使它成为最好的,但可能会对数组值进行排序,然后考虑到它们的排序可以更快,即使是O(nlog(n))方法。如果第一次失败,您可以尝试排序数据。