Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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/8/python-3.x/19.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 为什么嵌套列表合并时“functools.reduce”和“itertools.chain.from_itertools”的计算时间不同_Python_Python 3.x_Reduce_Itertools_Functools - Fatal编程技术网

Python 为什么嵌套列表合并时“functools.reduce”和“itertools.chain.from_itertools”的计算时间不同

Python 为什么嵌套列表合并时“functools.reduce”和“itertools.chain.from_itertools”的计算时间不同,python,python-3.x,reduce,itertools,functools,Python,Python 3.x,Reduce,Itertools,Functools,有时,您应该嵌套合并到合并列表。它类似于np.flatte。 当列表列表如下所示时,您应该将其展平 a = [[j for j in range(0, 10)] for i in range(0, 10000)] 你有两种解决方法。itertools.chain.from_iterable和functools.reduce 你认为哪一件更快,比另一件快多少 当列表长度较大时,itertools.chain.from_iterable的速度会快1000倍或更多 如果有人知道这件事发生的原因,请告

有时,您应该嵌套合并到合并列表。它类似于np.flatte。 当列表列表如下所示时,您应该将其展平

a = [[j for j in range(0, 10)] for i in range(0, 10000)]
你有两种解决方法。itertools.chain.from_iterable和functools.reduce

你认为哪一件更快,比另一件快多少

当列表长度较大时,itertools.chain.from_iterable的速度会快1000倍或更多

如果有人知道这件事发生的原因,请告诉我


始终为您提供thx支持和帮助。

是,因为列表串联,即使用+,是一种开启操作。当您以增量方式构建大小为N的列表时,它将变为ON2

相反,使用chain.from_iterable将使用具有线性性能的列表类型构造函数对最终列表中的所有N项进行迭代

这就是为什么您不应该使用sum来展平列表注释,还原lambda x,y:x+y,。。。就是简单的总和

注意,像这样展开嵌套列表的惯用方法是使用列表理解:

[x for sub in a for x in sub]
这是一种反模式,sum方法阻止您使用str对象:

这非常清楚地说明了循环中昂贵的+。请注意,以下简单方法实际上对行为而不是对2有影响:


这是因为my_list+=某物相当于my_list.extendsomething,而.extend with.append具有摊销的常量时间行为,因此总体而言,它将处于启用状态。

thx。您提到的惯用方法是更好的解决方法。更多关于计算的解释对我很有帮助。此外,使用lambda的reduce甚至比sum还要慢,因为除了C方法调用外,它还必须通过内部循环执行Python函数调用。在这种情况下,这可能没有多大关系,因为C方法调用对所有副本的串联做了很多工作,但一般来说,当它们都不是一个糟糕的想法时,sum会更快。而且可读性更高,篇幅更短,更难出错。当我们这样做的时候,你真的需要一个列表而不仅仅是一个迭代器吗?如果您只需要单步执行一次,那么您可以节省一点时间和大量内存,还可以将时间“管道化”到其余代码中,而不是在开始任何操作之前,直接使用链迭代器。
[x for sub in a for x in sub]
>>> sum(['here', 'is', 'some', 'strings'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
result = []
for sub in a:
    result = result + sub
result = []
for sub in a:
    result += sub