পাইথনে একই কাজ করার একাধিক পদ্ধতি থাকে। লিস্ট ইনিশিয়ালাইজেশন (initialization) এর ক্ষেত্রেও 마찬가지। তবে পারফরম্যান্সে পার্থক্য থাকতে পারে। পাইথন C++ বা Java-র চেয়ে ধীর, বিশেষ করে for লুপ। map(), filter() বা লিস্ট কমপ্রিহেনশন (list comprehension) সি (C)-তে লিখা থাকায় দ্রুত।
পারফরম্যান্স তুলনা (৫০০ বার রান করে গড়)
import time
forLoopTime = []
whileLoopTime = []
listComprehensionTime = []
starOperatorTime = []
for k in range(500):
# ১. for loop + append()
start = time.time()
a = []
for i in range(10000):
a.append(0)
stop = time.time()
forLoopTime.append(stop - start)
# ২. while loop + append()
start = time.time()
a = []
i = 0
while i < 10000:
a.append(0)
i += 1
stop = time.time()
whileLoopTime.append(stop - start)
# ৩. List comprehension
start = time.time()
a = [0 for i in range(10000)]
stop = time.time()
listComprehensionTime.append(stop - start)
# ৪. Star operator (*)
start = time.time()
a = [0] * 10000
stop = time.time()
starOperatorTime.append(stop - start)
print("Average time taken by for loop: " + str(sum(forLoopTime)/500))
print("Average time taken by while loop: " + str(sum(whileLoopTime)/500))
print("Average time taken by list comprehensions: " + str(sum(listComprehensionTime)/500))
print("Average time taken by * operator: " + str(sum(starOperatorTime)/500))
ফলাফল (টিপিক্যাল আউটপুট)
Average time taken by for loop: 0.0062 Average time taken by while loop: 0.0089 Average time taken by list comprehensions: 0.0032 Average time taken by * operator: 0.00037
বিশ্লেষণ
- Star operator ([0]*n): সবচেয়ে দ্রুত। একই অবজেক্ট রিপিট করে (immutable অবজেক্টের জন্য নিরাপদ)।
- List comprehension: for loop-র চেয়ে প্রায় ২গুন দ্রুত। পাইথনিক (Pythonic) পদ্ধতি।
- For loop + append(): স্ট্যান্ডার্ড পদ্ধতি, পড়লেও বুঝতে সহজ।
- While loop: সবচেয়ে ধীর। পাইথনে এড়াতে ভালো।
সাবধানতা: Star operator-র সাথে mutable অবজেক্ট
# ভুল: সব সাবলিস্ট একই অবজেক্ট রেফার করবে
matrix = [[0]*3]*3 # [[0,0,0], [0,0,0], [0,0,0]] - কিন্তু তিনটিই একই লিস্ট!
matrix[0][0] = 1 # সব সারির প্রথম এলিমেন্ট ১ হয়ে যাবে
# সঠিক: List comprehension
matrix = [[0]*3 for _ in range(3)] # প্রতিটি সারি আলাদা লিস্ট
সারাংশ
- Immutable ভ্যালু (int, str, tuple) এর জন্য
[val]*nসেরা। - Mutable অবজেক্ট (list, dict) এর জন্য লিস্ট কমপ্রিহেনশন ব্যবহার করুন।
- পড়ার সুবিধার্থে লিস্ট কমপ্রিহেনশন ভালো অভ্যাস।