Python—通过计算从列表创建元组的最快方法

Python—通过计算从列表创建元组的最快方法,python,list,tuples,Python,List,Tuples,我需要以尽可能快的方式从列表中创建一个Python元组,但需要进行中间计算。为了更清楚,我放了一段代码片段: a=[1,2,3,4] b=tuple([id(x) for x in a]) 这就是我现在拥有的。 还有比这更好的吗?这段代码创建一个列表,然后将其转换为一个元组,有没有直接创建元组的方法 谢谢大家! [编辑] 正如我建议的那样,我试过 b=tuple(id(x) for x in a) 然而,它似乎比以前慢。 测试脚本: import time a=[1,2,3,4] t1=

我需要以尽可能快的方式从列表中创建一个Python元组,但需要进行中间计算。为了更清楚,我放了一段代码片段:

a=[1,2,3,4]
b=tuple([id(x) for x in a])
这就是我现在拥有的。 还有比这更好的吗?这段代码创建一个列表,然后将其转换为一个元组,有没有直接创建元组的方法

谢谢大家!

[编辑] 正如我建议的那样,我试过

b=tuple(id(x) for x in a)
然而,它似乎比以前慢。 测试脚本:

import time

a=[1,2,3,4]

t1=time.time()
for i in range(1000000):
    b=tuple([id(x) for x in a])
print(time.time()-t1)

t2=time.time()
for i in range(1000000):
    b=tuple(id(x) for x in a)
print(time.time()-t2)

这让我非常意外。

使用列表理解更快。这是因为元组的大小是预先知道的(内存可以分配给
len(list)
项)

使用生成器时,首先需要将生成器转换为序列,以便可以分配元组。由于发电机固有的开销,这将变得更慢



最快的选择自然是根本不使用元组,而是使用列表。在我看来,元组不同于“不可变列表”;只有当需要将序列用作字典键或集合元素,或者可以命名每个元素时(如
namedtuple
),才应该真正使用元组。

使用列表理解更快。这是因为元组的大小是预先知道的(内存可以分配给
len(list)
项)

使用生成器时,首先需要将生成器转换为序列,以便可以分配元组。由于发电机固有的开销,这将变得更慢




最快的选择自然是根本不使用元组,而是使用列表。在我看来,元组不同于“不可变列表”;只有当需要将序列用作字典键或集合元素,或者可以命名每个元素(如
namedtuple
)时,才应该真正使用tuple。

tuple(a中x的id(x)
不会创建中间列表hank,我不知道这种可能性。但是我的问题似乎比较慢,我编辑我的问题。你在Python 2或Python 3中这样做吗?和你的问题没有直接关系,但是考虑使用<代码> TimeIt <代码>模块,而不是<代码>时间。code>timeit提供了更可靠的结果,因为它在Python 3上多次运行每个部分,从而减少了外部干扰的影响(例如Python将休眠一毫秒,以便CPU可以集中精力处理计算机上的不同应用程序)@Kevin谢谢你的建议。
tuple(a中x的id(x)
不会创建中间列表Hank,我不知道这种可能性。但是我的问题似乎比较慢,我编辑我的问题。你在Python 2或Python 3中这样做吗?和你的问题没有直接关系,但是考虑使用<代码> TimeIt <代码>模块,而不是<代码>时间。code>timeit提供了更可靠的结果,因为它在Python 3上多次运行每个部分,从而减少了外部干扰的影响(例如Python将休眠一毫秒,以便CPU可以集中精力处理计算机上的不同应用程序)@凯文:谢谢你的建议。好的,谢谢。列表不适合我,因为我需要一个不可变的集合。在本例中,有比元组更快的替代方法吗?@stefano1 Tuple是任意元素的不可变序列。特别是当您需要它作为字典键或集合中的元素时使用;对于其他情况,列表也一样好,只需说它是不可修改的。毕竟,没有“不变的字典”这样的东西。我需要它就像一个字典键一样:)但是无论如何谢谢你的解释!你能解释一下为什么我们不应该不必要地使用元组吗?我在一些地方读到过,比如说文字元组的计算速度比列表快。@MadPsychologist是的,但这不是文字元组。好的,谢谢。列表不适合我,因为我需要一个不可变的集合。在本例中,有比元组更快的替代方法吗?@stefano1 Tuple是任意元素的不可变序列。特别是当您需要它作为字典键或集合中的元素时使用;对于其他情况,列表也一样好,只需说它是不可修改的。毕竟,没有“不变的字典”这样的东西。我需要它就像一个字典键一样:)但是无论如何谢谢你的解释!你能解释一下为什么我们不应该不必要地使用元组吗?我在一些地方读到过,比如说文字元组的计算速度比列表快。@MadPsychologist是的,但这不是文字元组。