Python 3.14에서 리스트를 만드는 게 튜플을 만드는 것보다 빠르더군요. 제 컴퓨터에서는 대략 ~20개 원소부터 차이가 나기 시작해요.
꽤 흥미롭네요. 어떻게 가능해진 건가요? 튜플에도 같은 최적화를 적용할 수 있지 않을까요?
Python 3.14에서 리스트를 만드는 게 튜플을 만드는 것보다 빠르더군요. 제 컴퓨터에서는 대략 ~20개 원소부터 차이가 나기 시작해요.
꽤 흥미롭네요. 어떻게 가능해진 건가요? 튜플에도 같은 최적화를 적용할 수 있지 않을까요?
I've found that constructing a list beats constructing a tuple on Python 3.14. For my computer, this begins at roughly ~20 elements.
That seems rather intriguing. What made this possible? Could tuples receive that optimization as well?
실제 벤치마크 코드(리스트와 튜플을 만드는 방법은 각각 여러 가지죠), 측정 방법, 나온 수치를 좀 더 자세히 알려 주실래요? 이전 Python 버전에서도 차이가 났나요?
저도 비슷한 걸 알아보면서 다음 네 가지를 비교한 적 있어요:
1. list(values)
2. [*values]
3. tuple(values)
4. (*values,)
제 기억으론 2가 1보다 빨랐는데 3이 4보다 빨라서 이상했어요. 결국 어떤 결론을 냈는지는 잊어버렸네요…
Would you provide some more specifics, including your actual benchmark code (lists and tuples can each be constructed several ways), the measurement method and the figures you got? Were older Python releases different, too?
I've investigated a similar question myself, looking at these four alternatives:
1. list(values)
2. [*values]
3. tuple(values)
4. (*values,)
As I recoll, 2 beat 1, whereas 3 beat 4, which seemed strange. I've forgotten what conclusion I reached there…
방금 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]를 문법으로 바로 처리할 수 있으니까요.)
아무튼 어렴풋한 기억으로는 튜플은 보통 짧게 쓰니까 생성도 짧은 경우에 맞춰 최적화했던 것 같아요. 보통 객체를 잔뜩 담으려면 튜플 대신 리스트를 쓰죠. 입력이 작을 때를 개선하면 큰 입력에서는 느려질 수도 있고요.
I've just repeated the test using 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]
script
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)
Run This Example!
(The advantage of [*values] over list(values) applied to small iterables, since the interpreter can process [*values] directly as syntax.)
Regardless, my hazy recollection is that constructing tuples favors small ones, since those are what people typically need. Generally you'd choose a list rather than fill a tuple with lots of objects. Improving the small-input case can also make larger inputs slower.
안녕하세요, Rust 컴파일러 개발을 처음 시작해서 컴파일러 최적화를 구현해 보고 있어요. Rust가 생성한 프로그램이 얼마나 효율적으로 실행되는지 평가할 때 업계나 커뮤니티에서 가장 흔히 쓰는 벤치마크 모음을 추천해 주실…