Python 3.x 加速计算笛卡尔积和
由于代码运行太长,我的自动筛选考试有几个测试用例失败。有没有办法更有效地写这篇文章 提示类似于: 编写一个程序,将一个列表作为输入,并返回成对连接其元素的所有组合的总和 例如,对于列表[20,5],这将是: 2020+205+520+55=2800 我仍然想不出一种不转换为string并返回int的方法来实现这一点。列表理解以前是为执行更差的循环嵌套的,但我仍然需要更高的速度Python 3.x 加速计算笛卡尔积和,python-3.x,sum,cartesian-product,Python 3.x,Sum,Cartesian Product,由于代码运行太长,我的自动筛选考试有几个测试用例失败。有没有办法更有效地写这篇文章 提示类似于: 编写一个程序,将一个列表作为输入,并返回成对连接其元素的所有组合的总和 例如,对于列表[20,5],这将是: 2020+205+520+55=2800 我仍然想不出一种不转换为string并返回int的方法来实现这一点。列表理解以前是为执行更差的循环嵌套的,但我仍然需要更高的速度 def concatenationsSum(a): # turn into strings a = [str(i) f
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返回10,所以当你有20和5时,你可以做20*digits[5]+5=205
,这加快了整个过程
此外,无需在列表中使用double for循环,因为itertools提供了返回笛卡尔乘积的product()
测试完成:对于大约8个元素的小列表,我从4.6e05平均到3.1e05,对于5400个元素的大列表,它从11.7秒平均到5.3秒。这大约是速度的两倍。想想A/B对AB的贡献的价值。然后考虑A的贡献,最后是B的所有。你能用另一种方式来表达吗?我不明白。从你的例子来看:2020+205+520+55=20*100+20+20*10+5+5*100+20+5*10+5=(20+5)*100+(20+5)*10+(20+5)*2。谢谢你,这正是@Scott Hunter在评论中建议的吗?从你的例子来看:2020+205+520+55=20*100+20+20*10+5+5*100+20+5*10+5=(20+5)*100+(20+5)*10+(20+5)*2那是我用笔和纸做的,但数学不好。使用日志查找要乘以的位数。不知道笛卡尔产品是否有本地支持。谢谢。实际上它完成了平等的第一部分,但不是第二部分。