用于for循环优化的Python

时间:2015-02-14 03:15:05

标签: python c++ loops python-3.x optimization

所以我得到了一段代码,我试着让它运行得更快......因为它需要40秒才能执行:

for i in range (1, len(pk), 2): for j in range (2, len(pk), 2): b = random.randrange(2 ** Const.ALPHA) sum += (b * pk[i] * pk[j])

我试过Threads ......它运行速度不快。 我尝试使用sum()和其中嵌入的两个for循环。它也不会运行得更快。

pk元素非常大int。

现在,len(pk)等于162而Const.ALPHA等于9.但是将来它可能会更多。

THX

PS:顺便说一句,如果您能猜出使用这些变量的程序的目的,那么您会得到一个cookie。

1 个答案:

答案 0 :(得分:2)

我没有i7 :)而且我不知道你的数字有多大。我尝试使用65536位pk[i],你的功能花了将近10.5秒,所以我想你的数字仍然要大得多。

但我认为结果应该是指示性的。下面的功能需要0.45秒(加速比20倍更好);它可以通过将sum(sum(r(b)*pk[i]*pk[j]))转换为sum(pk[i]*sum(r(b)*pk[j]))来避免倍增bignums。这不仅减少了乘法次数,剩下的大部分乘法都是小号* bignum而不是bignum * bignum。

使用生成器和列表推导可能没有帮助。 YMMV。

def xmul(pk):
  # The speedup from these locals is insignificant, but
  # it lets the inline generator fit on a line.
  rmax = 2**const.ALPHA
  r = random.randrange
  return sum(
        pki * sum(r(rmax) * pkj for pkj in pk[2::2])
        for pki in pk[1::2]
  )