সংক্ষিপ্ত অজগর তালিকার প্রিপেন্ডিংয়ের আইডিয়োমেটিক সিনট্যাক্স কী?
আপনি সাধারণত পাইথনের একটি তালিকাতে পুনরাবৃত্তভাবে সংশোধন করতে চান না।
যদি এটি সংক্ষিপ্ত হয় , এবং আপনি এটি খুব বেশি কিছু করছেন না ... তবে ঠিক আছে।
list.insert
list.insertএই ভাবে ব্যবহার করা যাবে।
list.insert(0, x)
তবে এটি অকার্যকর, কারণ পাইথন-এ, listপয়েন্টারগুলির একটি অ্যারে এবং পাইথনকে অবশ্যই তালিকার প্রতিটি পয়েন্টারটি নিতে হবে এবং প্রথম স্লটে আপনার অবজেক্টে পয়েন্টারটি সন্নিবেশ করতে একে একে নীচে সরানো উচিত, সুতরাং এটি সত্যই কেবল দক্ষ বরং আপনি চান হিসাবে সংক্ষিপ্ত তালিকা।
এটি সিপিথন উত্স থেকে একটি স্নিপেট রয়েছে যেখানে এটি প্রয়োগ করা হয়েছে - এবং আপনি দেখতে পাচ্ছেন যে, আমরা অ্যারের শেষে শুরু করি এবং প্রতিটি সন্নিবেশের জন্য সবকিছুকে এক এক করে সরিয়ে নিয়ে যাই:
for (i = n; --i >= where; )
items[i+1] = items[i];
যদি আপনি এমন ধারক / তালিকা চান যা প্রিপেন্ডিং উপাদানগুলিতে দক্ষ হয় তবে আপনি একটি লিঙ্কযুক্ত তালিকা চান। পাইথনের একটি দ্বিগুণ লিঙ্কযুক্ত তালিকা রয়েছে, যা শুরুতে সন্নিবেশ করা যায় এবং দ্রুত শেষ হতে পারে - এটিকে বলা হয় এ deque।
deque.appendleft
এ collections.dequeতালিকার অনেকগুলি পদ্ধতি রয়েছে। সম্পূর্ণ ব্যতীত লিসকভের পরিবর্তে স্থায়ী নয় এমনটি list.sortব্যতিক্রম ।dequelist
>>> set(dir(list)) - set(dir(deque))
{'sort'}
dequeএছাড়াও একটি হয়েছে appendleftপদ্ধতি (সেইসাথে popleft)। dequeএকটি ডবল শেষ হয়েছে কিউ এবং একটি দোকর-লিঙ্ক তালিকা - কোন ব্যাপার দৈর্ঘ্য, এটা সবসময় preprend কিছু সময় একই পরিমাণ সময় লাগে। বড় হে স্বরলিপিতে ও (1) বনাম ও (এন) তালিকার জন্য সময়। এখানে ব্যবহার:
>>> import collections
>>> d = collections.deque('1234')
>>> d
deque(['1', '2', '3', '4'])
>>> d.appendleft('0')
>>> d
deque(['0', '1', '2', '3', '4'])
deque.extendleft
এছাড়াও ডেকির extendleftপদ্ধতিটি প্রাসঙ্গিক , যা পুনরাবৃত্তভাবে পূর্বে সংশোধন করে:
>>> from collections import deque
>>> d2 = deque('def')
>>> d2.extendleft('cba')
>>> d2
deque(['a', 'b', 'c', 'd', 'e', 'f'])
নোট করুন যে প্রতিটি উপাদান একবারে একটি করে চাপিয়ে দেওয়া হবে, যাতে কার্যকরভাবে তাদের ক্রমটি বিপরীত হয়।
listবনাম অভিনয়deque
প্রথমে আমরা কিছু পুনরাবৃত্তি প্রিপেন্ডিং সেটআপ করি:
import timeit
from collections import deque
def list_insert_0():
l = []
for i in range(20):
l.insert(0, i)
def list_slice_insert():
l = []
for i in range(20):
l[:0] = [i] # semantically same as list.insert(0, i)
def list_add():
l = []
for i in range(20):
l = [i] + l # caveat: new list each time
def deque_appendleft():
d = deque()
for i in range(20):
d.appendleft(i) # semantically same as list.insert(0, i)
def deque_extendleft():
d = deque()
d.extendleft(range(20)) # semantically same as deque_appendleft above
এবং কর্মক্ষমতা:
>>> min(timeit.repeat(list_insert_0))
2.8267281929729506
>>> min(timeit.repeat(list_slice_insert))
2.5210217320127413
>>> min(timeit.repeat(list_add))
2.0641671380144544
>>> min(timeit.repeat(deque_appendleft))
1.5863927800091915
>>> min(timeit.repeat(deque_extendleft))
0.5352169770048931
Deque অনেক দ্রুত। তালিকাগুলি আরও দীর্ঘ হওয়ার সাথে সাথে আমি আরও ভাল পারফরম্যান্সের প্রত্যাশা করব। আপনি যদি ডেকের ব্যবহার করতে পারেন তবে আপনি extendleftসম্ভবত সেরা অভিনয়টি পাবেন।