197*_*197 5 python tuples list
只是说我有一个清单
a = (3, 2, 9, 4)
Run Code Online (Sandbox Code Playgroud)
我想在每个数字中加一个并存储结果,(我之后不需要操纵结果),我的第一个想法就是:
[x + 1 for x in a]
Run Code Online (Sandbox Code Playgroud)
但是关于:
tuple(x + 1 for x in a)
Run Code Online (Sandbox Code Playgroud)
元组意味着更快吧?如果我不需要在此代码更高效后更改结果?它是如何工作的,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
Run Code Online (Sandbox Code Playgroud)
因此,似乎元组构造函数变体需要大约四倍的时间,我想因为列表推导相当优化(在cpython中).
但让我们仔细看看:
In : f3 = lambda: list(x + 1 for x in a)
In : timeit.timeit(f3)
Out: 2.5421998500823975
Run Code Online (Sandbox Code Playgroud)
所以这与元组结构大致相同,这表明性能损失在于生成器表达式开销.(我们可以排除列表/元组结构,见下面的编辑)
它甚至比map()列表慢两倍:
In : inc = partial(operator.add,1)
In : f4 = lambda:map(inc, a)
In : timeit.timeit(f4)
Out: 1.2346529960632324
Run Code Online (Sandbox Code Playgroud)
我认为这实际上归结为(cpython)实现细节,所以不要依赖于此.无论如何 - 不要担心性能,它只是2-4的因素,使用最好阅读的方法.
如果您确实遇到了性能瓶颈,请在发现它们之后进行调查和优化.我敢打赌,列表操作中的因子4将是您遇到问题的最小因素.
编辑: 有人提到"元组"的查找成本可能会导致速度减慢,但事实并非如此:
In : f5 = lambda: tuple([x + 1 for x in a])
In : timeit.timeit(f5)
Out: 0.7900090217590332
Run Code Online (Sandbox Code Playgroud)
所以我猜这真的是生成器表达式开销会降低速度.
| 归档时间: |
|
| 查看次数: |
3543 次 |
| 最近记录: |