खैर, जैसा कि ट्रूफ़ा ने पहले ही दिखाया है, मूल रूप से एक दिए गए इंडेक्स में टपल के तत्व को बदलने के दो तरीके हैं। या तो टपल को सूची में बदलें, तत्व को बदलें और वापस रूपांतरित करें, या संघनन द्वारा एक नया टपल का निर्माण करें।
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:]
...:
तो, कौन सा तरीका बेहतर है, जो कि तेज है?
यह पता चला है कि छोटे ट्यूपल्स के लिए (पायथन 3.3 पर), वास्तव में गति तेज है!
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
फिर भी यदि हम लंबे समय तक देखते हैं, तो सूची रूपांतरण रास्ता तय करना है:
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
बहुत लंबे tuples के लिए, सूची रूपांतरण काफी बेहतर है!
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
इसके अलावा, संघनन विधि का प्रदर्शन उस सूचकांक पर निर्भर करता है जिस पर हम तत्व को प्रतिस्थापित करते हैं। सूची विधि के लिए, सूचकांक अप्रासंगिक है।
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
इसलिए: यदि आपका टुपल छोटा है, तो स्लाइस और कंसीनेट करें। यदि यह लंबा है, तो सूची रूपांतरण करें!