các concatenates điều hành bổ sung bản ghi trong python:
('a', 'b')+('c', 'd')
Out[34]: ('a', 'b', 'c', 'd')
Từ docstring của sum
:
Return tổng của một giá trị 'start' (mặc định: 0) cộng với một iterable của số
Điều đó có nghĩa là sum
không bắt đầu bằng yếu tố đầu tiên của bạn có thể lặp lại, nhưng thay vì với giá trị ban đầu được chuyển qua đối số start=
.
Theo mặc định sum
được sử dụng với số, do đó giá trị bắt đầu mặc định là 0
. Vì vậy, việc tổng hợp các bộ dữ liệu có thể lặp lại cần phải bắt đầu bằng một bộ trống. ()
là một tuple trống:
type(())
Out[36]: tuple
Do đó nối làm việc.
Theo hiệu suất, đây là một so sánh:
%timeit sum(tuples,())
The slowest run took 9.40 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 285 ns per loop
%timeit tuple(it.chain.from_iterable(tuples))
The slowest run took 5.00 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 625 ns per loop
Bây giờ với t2 của 10000 kích thước:
%timeit sum(t2,())
10 loops, best of 3: 188 ms per loop
%timeit tuple(it.chain.from_iterable(t2))
1000 loops, best of 3: 526 µs per loop
Vì vậy, nếu danh sách các tuples là nhỏ, bạn đừng bận tâm. Nếu kích thước trung bình hoặc lớn hơn, bạn nên sử dụng itertools
.
Tại sao không nên cho nó hoạt động? Nó chỉ thêm các bộ dữ liệu với nhau, nhưng nó không đặc biệt hiệu quả. Hãy xem [itertools.chain] (https://docs.python.org/3/library/itertools.html#itertools.chain). Ví dụ: 'tuple (chuỗi (* tuples))' –
@ PM2Ring. Tránh sử dụng 'chuỗi' như thế vì nó thậm chí còn kém hiệu quả hơn' tổng hợp' (trừ khi tập hợp các bộ dữ liệu là rất nhỏ). Thay vào đó hãy sử dụng 'chain.from_iterable'. – ekhumoro
@ekhumoro Rất tiếc! Có, chain.from_iterable là tốt hơn. Và như câu trả lời của Boud cho thấy, nó thực sự chậm hơn tổng cho các bộ sưu tập nhỏ của bộ dữ liệu. –