加快计算笛卡尔积的总和

Speed up calculating sum of cartesian products

由于我的代码 运行 太长,我未能通过自动筛选考试的多个测试用例。有没有办法更有效地编写这个?

提示是这样的:

编写一个程序,将一个列表作为输入,returns将其元素成对连接的所有组合的总和。

例如,对于列表 [20, 5] 这将是:

2020 + 205 + 520 + 55 = 2800

我仍然想不出不强制转换为字符串并返回 int 的方法。列表推导式之前嵌套了循环,性能更差,但我仍然需要更快的速度。

def concatenationsSum(a):
# turn into strings 
a = [str(i) for i in a]
# concat 
cartesian_product = [j + k for j in a for k in a]
# turn back into integers
total = [int(i) for i in cartesian_product]

return sum(total)

所以我在你的代码中尝试了一些优化,你这里的主要瓶颈是转换为 str 并返回到 int 所以我修改了那部分

def concatenationsSum(a):
   numDigits = {i: (10 ** (int(math.log10(i)) + 1)) for i in a}
   cpro = product(a, a)

   cartesian_product = [i * numDigits[x] + x for i, x in cpro]
   return sum(cartesian_product)

在这里你可以看到我改变了几个部分,我添加了一个字典来查找每个数字需要相乘的位数,一个例子是 5 returns 10 所以当你有 20和 5 你可以做 20 * digits[5] + 5 = 205 来加速整个过程。

也不需要在列表理解中使用双 for 循环 python itertools 提供 product() 其中 return 笛卡尔积。

测试完成:对于大约 8 个元素的小列表,我平均从 4.6e05 到 3.1e05,对于 5400 个元素的更大列表,它从平均 11.7 秒到 5.3 秒。这大约是速度的两倍。