Trufa'nın daha önce gösterdiği gibi, temelde belirli bir dizindeki bir demet elemanını değiştirmenin iki yolu vardır. Tuple'ı bir listeye dönüştürün, öğeyi değiştirin ve geri dönüştürün ya da birleştirme ile yeni bir demet oluşturun.
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:]
...:
Peki, hangi yöntem daha iyi, yani daha hızlı?
Kısa tuple'lar için (Python 3.3'te), birleştirme aslında daha hızlıdır!
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
Yine de daha uzun demetlere bakarsak, liste dönüştürme gidilecek yoldur:
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
Çok uzun tuplelar için liste dönüştürme önemli ölçüde daha iyidir!
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
Ayrıca, birleştirme yönteminin performansı, öğeyi değiştirdiğimiz dizine bağlıdır. Liste yöntemi için dizin konu dışıdır.
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
Yani: Demonuz kısaysa, dilimleyin ve birleştirin. Uzunsa, liste dönüştürme işlemini yapın!