Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 加速计算笛卡尔积和_Python 3.x_Sum_Cartesian Product - Fatal编程技术网

Python 3.x 加速计算笛卡尔积和

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

由于代码运行太长,我的自动筛选考试有几个测试用例失败。有没有办法更有效地写这篇文章

提示类似于:

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

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

2020+205+520+55=2800

我仍然想不出一种不转换为string并返回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返回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那是我用笔和纸做的,但数学不好。使用日志查找要乘以的位数。不知道笛卡尔产品是否有本地支持。谢谢。实际上它完成了平等的第一部分,但不是第二部分。