【问题标题】:Python for for loops OptimisationPython for for 循环优化
【发布时间】:2015-04-15 05:29:26
【问题描述】:

所以我得到了一段代码,我在上面尝试了让它运行得更快的方法......因为执行大约需要 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])

我尝试了线程...它运行速度并不快。 我尝试将 sum() 与嵌入其中的两个 for 循环一起使用。它也不会跑得更快。

pk 元素是非常大的 int。

现在,len(pk) 等于 162,Const.ALPHA 等于 9。但在未来,它很可能不止于此。

谢谢

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

【问题讨论】:

  • 您是说系统上大约 1600 个循环需要 40 秒?那是 Pentium 1 还是更早的版本?
  • 我想说的是显而易见的,但是用 C/C++ 实现它并从 Python 调用它呢? boost.org/doc/libs/1_49_0/libs/python/doc
  • @AshwiniChaudhary 获得了 i7 =)。整数非常非常大
  • @fzqf 然后试试gmpy
  • @Jack 问题是 C/C++ 本身并不管理大整数。因此,C/C++ 和 Python 之间的互操作性可能会变得复杂。

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


【解决方案1】:

我没有 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])) 来避免将bignum 相乘。这不仅减少了乘法,而且剩下的大部分乘法都是 smallnum * 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]
  )

【讨论】:

  • 这真是太棒了。非常感谢 =))
  • 是的,很明显pki不需要每次都相乘,但可以因式分解。
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2017-02-21
  • 2017-01-17
  • 2017-05-28
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多