Nun, wie Trufa bereits gezeigt hat, gibt es grundsätzlich zwei Möglichkeiten, das Element eines Tupels bei einem bestimmten Index zu ersetzen. Konvertieren Sie entweder das Tupel in eine Liste, ersetzen Sie das Element und konvertieren Sie es zurück oder erstellen Sie ein neues Tupel durch Verkettung.
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:]
...:
Also, welche Methode ist besser, das heißt schneller?
Es stellt sich heraus, dass bei kurzen Tupeln (unter Python 3.3) die Verkettung tatsächlich schneller ist!
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
Wenn wir uns jedoch längere Tupel ansehen, ist die Listenkonvertierung der richtige Weg:
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
Bei sehr langen Tupeln ist die Listenkonvertierung wesentlich besser!
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
Die Leistung der Verkettungsmethode hängt auch von dem Index ab, bei dem wir das Element ersetzen. Für die Listenmethode ist der Index irrelevant.
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
Also: Wenn Ihr Tupel kurz ist, schneiden Sie es auf und verketten Sie es. Wenn es lang ist, führen Sie die Listenkonvertierung durch!