openlang

Python 3.14 中创建元组比列表慢

我发现 Python 3.14 创建列表比创建元组快。在我的电脑上,元素达到大约 ~20 个时就开始出现差别。

这挺有意思。是怎么做到的?元组也能用同样的优化吗?

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    能再提供一些细节吗,包括实际的测试代码(创建列表和元组各有几种方式)、测量方法和得到的数字?以前的 Python 版本也有这个差别吗?

    我自己也研究过类似的问题,比较了下面四种写法。

    1. list(values)
    2. [*values]
    3. tuple(values)
    4. (*values,)

    我记得 2 比 1 快,可是 3 又比 4 快,让我觉得奇怪。已经忘了当时得出了什么结论……

    从英语翻译查看原文
  2. 固定链接

    我刚用 values = itertools.repeat(None, 2**20) 又测了一遍。

     4.02 ± 0.04 ms  list(values)
     3.97 ± 0.03 ms  [*values]
     4.76 ± 0.08 ms  tuple(values)
     7.91 ± 0.12 ms  (*values,)
    
    Python: 3.13.0 (main, Nov 12 2025, 14:27:38) [GCC 15.2.1 20250820]

    脚本

    from timeit import timeit
    from statistics import mean, stdev
    import random
    import sys
    
    prelude = """
    from itertools import repeat
    values = repeat(None, 2**20)
    """
    
    expressions = ['list(values)', '[*values]',
                   'tuple(values)', '(*values,)']
    
    samples = {expression: [] for expression in expressions}
    for trial in range(120):
        for expression in random.sample(expressions, len(expressions)):
            elapsed = timeit(expression, prelude, number=1)
            samples[expression].append(elapsed)
    for expression in expressions:
        fastest = [elapsed * 1e3 for elapsed in sorted(samples[expression])[:6]]
        print(f'{mean(fastest):5.2f} ± {stdev(fastest):3.2f} ms ', expression)
    
    print('\nPython:', sys.version)

    运行这个示例!

    ([*values] 比 list(values) 快,说的是较短的可迭代对象,因为解释器能把 [*values] 直接当作语法处理。)

    总之,我隐约记得创建元组时针对较短的情况做了优化,因为这才是常见用法。要放很多对象时,通常会选列表,而不是往元组里塞。优化较小输入的情况,也可能让较大输入变慢。

    从英语翻译查看原文

同一个问题的其他角度

  1. 通常使用哪些 Rust 运行性能基准测试?

    大家好, 我刚开始做 Rust 编译器开发,正在尝试实现编译器优化。能否推荐一下业界或社区最常用的基准测试集,用来评估 Rust 生成的程序执行效率,也就是应用的运行时性能,而不是编译速度? 我目前在用 rust-perf/runtime-bench…

    回复 2最近活动 rust