gpt4 book ai didi

python - 元组构造函数与列表组合

转载 作者:太空狗 更新时间:2023-10-30 00:41:15 24 4
gpt4 key购买 nike

就说我有一个列表

a = (3, 2, 9, 4)

我想给每个数字加一个并存储结果,(之后我不需要操作结果),我的第一个想法是:

[x + 1 for x in a]

但是关于:

tuple(x + 1 for x in a)

元组应该更快,对吧?如果我不需要更改结果,此代码是否更有效?还有它是如何工作的,tuple 构造函数是否必须从生成器表达式中创建一个列表来提前知道大小?提前感谢您的任何解释。

最佳答案

只是timeit():

In : a = (3, 2, 9, 4)

In : f1 = lambda: [x + 1 for x in a]

In : f2 = lambda: tuple(x + 1 for x in a)

In : timeit.timeit(f1)
Out: 0.595026969909668

In : timeit.timeit(f2)
Out: 2.360887050628662

所以看起来元组构造函数变体花费了大约四倍的时间,我猜是因为列表推导得到了相当优化(在 cpython 中)。

但让我们仔细看看:

In : f3 = lambda: list(x + 1 for x in a)

In : timeit.timeit(f3)
Out: 2.5421998500823975

所以这与元组构造花费的时间大致相同,这表明性能损失在于生成器表达式开销。 (我们可以排除列表/元组构造,参见下面的编辑)

它甚至比 map() 列表慢两倍:

In : inc = partial(operator.add,1)

In : f4 = lambda:map(inc, a)

In : timeit.timeit(f4)
Out: 1.2346529960632324

我认为这实际上归结为 (cpython) 实现细节,所以不要依赖它。无论如何 - 不要担心性能,它只是 2-4 的一个因素,使用最适合阅读的方法。

如果您确实遇到了性能瓶颈,请在您注意到它们之后对其进行调查和优化。我敢打赌,列表操作中的因子 4 将是您遇到的最少的问题。

编辑:有人提到“元组”的查找成本可能会导致速度变慢,但事实并非如此:

In : f5 = lambda: tuple([x + 1 for x in a])

In : timeit.timeit(f5)
Out: 0.7900090217590332

所以我猜这真的是生成器表达式开销导致速度变慢。

关于python - 元组构造函数与列表组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com