Như Trufa đã chỉ ra, về cơ bản có hai cách để thay thế phần tử của tuple tại một chỉ mục nhất định. Chuyển đổi tuple thành danh sách, thay thế phần tử và chuyển đổi trở lại hoặc tạo một tuple mới bằng cách nối.
In [1]: def replace_at_index1(tup, ix, val):
...: lst = list(tup)
...: lst[ix] = val
...: return tuple(lst)
...:
In [2]: def replace_at_index2(tup, ix, val):
...: return tup[:ix] + (val,) + tup[ix+1:]
...:
Vì vậy, phương pháp nào tốt hơn, tức là, nhanh hơn?
Hóa ra là đối với các bộ giá trị ngắn (trên Python 3.3), việc nối thực sự nhanh hơn!
In [3]: d = tuple(range(10))
In [4]: %timeit replace_at_index1(d, 5, 99)
1000000 loops, best of 3: 872 ns per loop
In [5]: %timeit replace_at_index2(d, 5, 99)
1000000 loops, best of 3: 642 ns per loop
Tuy nhiên, nếu chúng ta xem xét các bộ giá trị dài hơn, chuyển đổi danh sách là cách để thực hiện:
In [6]: k = tuple(range(1000))
In [7]: %timeit replace_at_index1(k, 500, 99)
100000 loops, best of 3: 9.08 µs per loop
In [8]: %timeit replace_at_index2(k, 500, 99)
100000 loops, best of 3: 10.1 µs per loop
Đối với các bộ giá trị rất dài, chuyển đổi danh sách về cơ bản tốt hơn đáng kể!
In [9]: m = tuple(range(1000000))
In [10]: %timeit replace_at_index1(m, 500000, 99)
10 loops, best of 3: 26.6 ms per loop
In [11]: %timeit replace_at_index2(m, 500000, 99)
10 loops, best of 3: 35.9 ms per loop
Ngoài ra, hiệu suất của phương pháp nối phụ thuộc vào chỉ mục mà chúng ta thay thế phần tử. Đối với phương pháp danh sách, chỉ mục là không liên quan.
In [12]: %timeit replace_at_index1(m, 900000, 99)
10 loops, best of 3: 26.6 ms per loop
In [13]: %timeit replace_at_index2(m, 900000, 99)
10 loops, best of 3: 49.2 ms per loop
Vì vậy: Nếu tuple của bạn ngắn, hãy cắt và nối. Nếu nó dài, hãy thực hiện chuyển đổi danh sách!