Python 迭代器到序列转换的哪个操作最快?

Python 迭代器到序列转换的哪个操作最快?,python,python-3.x,performance,Python,Python 3.x,Performance,我必须将迭代器转换为可下标序列(例如列表、元组)。现在,当我试图这样做时,我偶然发现了两种实现这一目标的方法。现在的问题是,哪一个是最推荐和最快的 使用tuple或list的构造函数进行转换 percents=范围(100+1) 元组(百分比)#到一个元组。 列表(百分比)#添加到列表中。 在元组或列表中使用解包 [*percents] # to a list. (*percents,) # to a tuple. 有趣的是,列表和元组的答案不一样(也就是说,在我的特定机器上运行Pyt

我必须将迭代器转换为可下标序列(例如列表、元组)。现在,当我试图这样做时,我偶然发现了两种实现这一目标的方法。现在的问题是,哪一个是最推荐和最快的

使用
tuple
list
的构造函数进行转换

percents=范围(100+1)
元组(百分比)#到一个元组。
列表(百分比)#添加到列表中。
元组
列表
中使用解包

[*percents]   # to a list.
(*percents,)  # to a tuple.

有趣的是,列表和元组的答案不一样(也就是说,在我的特定机器上运行Python 3.8-取决于代码运行的位置和使用的Python版本,您的里程可能会有所不同):

结果:

0.48456099999999996
0.5760516999999999
0.4818578
0.3919844000000001
对于更大的iterables,这一点保持不变

现在,我无法告诉你们,为什么列表的解包速度更快,而元组的解包速度较慢。这可能与列表理解处理其参数的方式和元组理解有关。令人惊讶的是,这两个构造函数非常相似,而理解
unpack\u into\u tuple()
要比理解
unpack\u into\u list()慢得多

你的问题是“推荐的和快速的”。我想说它们都很快,所以推荐的选项应该是代码中可读性和可维护性最好的选项


如果这是代码中执行数百万次的关键部分,那么您可能会关心速度,但您必须怀疑Python是否是最佳选择。你最好选择对别人和你未来的自己读得最清楚的选项。

我试过了,他们非常接近

import timeit
percents = range(100+1)
timeit.timeit('tuple(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('list(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('(*percents,)', number=10000, setup="from __main__ import percents")
timeit.timeit('[*percents]', number=10000, setup="from __main__ import percents")

您可以试试看

哪一个应用程序运行得最快?使用
timeit
运行一些实验。标准方法是使用
list
tuple
构造函数。我从未见过解包仅用于评估生成器。生成器只是一个示例,因为它非常类似于迭代器。
import timeit
percents = range(100+1)
timeit.timeit('tuple(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('list(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('(*percents,)', number=10000, setup="from __main__ import percents")
timeit.timeit('[*percents]', number=10000, setup="from __main__ import percents")