【发布时间】:2014-12-23 12:34:22
【问题描述】:
我在 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 解决方案,但在速度上没有得到任何真正的提高。
您知道任何智能解决方案吗?
【问题讨论】:
-
Python 相当慢,尤其是在紧密的循环中。如果 pypy 不起作用,则在 c (cython) 中对其进行编码。
-
为什么有两个循环?正如 simonzack 所说,cython 将显着提高性能。
-
这段来自 scipy 2013 的视频将告诉你该怎么做youtube.com/watch?v=KJFaJoJCqlU
-
您可以使用并行处理。创建进程池。每个进程都在 g() 上运行。打破范围(1000000)。给每个进程范围,x。您可以在
-
您是否尝试过使用
sorted(enumerate(a), key = lambda x: x[1])之类的方式对列表进行排序以保留原始索引?
标签: python performance list match