所以我得到了一段代码,我试着让它运行得更快......因为它需要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。
答案 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]
)