لیست – صف های وحشتناکی آهسته
لیست – صف های وحشتناکی آهسته
می توان از یک لیست معمولی به عنوان یک صف استفاده کرد، اما این گزینه ایده آل نیست
برای این منظور، لیست ها بسیار کند هستند، زیرا درج یا حذف یک عنصر در ابتدا مستلزم جابجایی همه عناصر دیگر توسط یک، به زمان O(n) است.
بنابراین، من استفاده از یک لیست را به عنوان موقت توصیه نمی کنم
صف در پایتون (مگر اینکه فقط با تعداد کمی از عناصر سروکار داشته باشید).
q = []
q.append(‘eat’)
q.append(‘sleep’)
q.append(‘code’)
q
[‘eat’, ‘sleep’, ‘code’]Careful: This is slow!
q.pop(0)
‘eat’
collections.deque – صف های سریع و قوی
کلاس deque یک صف دو طرفه را اجرا می کند که پشتیبانی می کند
افزودن و حذف عناصر از هر دو طرف در زمان O(1) (استهلاک نشده). زیرا deques از افزودن و حذف عناصر پشتیبانی می کند
از هر دو طرف به یک اندازه خوب، آنها می توانند هم به عنوان صف و هم به عنوان خدمت کنند
پشته ها.35
اشیاء deque پایتون به صورت لیست هایی با پیوند دوگانه پیاده سازی می شوند
به آنها عملکرد عالی و ثابت برای درج و
حذف عناصر، اما عملکرد ضعیف O(n) برای دسترسی تصادفی
عناصر در وسط پشته.
در نتیجه، اگر به دنبال ساختار داده صف در کتابخانه استاندارد پایتون هستید، collections.deque یک انتخاب پیشفرض عالی است.from collections import deque
q = deque()
q.append(‘eat’)
q.append(‘sleep’)
q.append(‘code’)
q
deque([‘eat’, ‘sleep’, ‘code’])
q.popleft()
‘eat’
q.popleft()
‘sleep’
q.popleft()
‘code’
q.popleft()
IndexError: “pop from an empty deque”
queue.Queue – قفل کردن معناشناسی برای موازی
محاسبه
این اجرای صف در کتابخانه استاندارد پایتون همگام سازی شده است و معنایی قفل را برای پشتیبانی چندین همزمان ارائه می دهد.
تولیدکنندگان و مصرف کنندگان.37
ماژول صف شامل چندین کلاس دیگر است که صف های چند تولید کننده/چند مصرف کننده را پیاده سازی می کنند که برای محاسبات موازی مفید هستند.
بسته به مورد استفاده شما، معنای قفل ممکن است مفید باشد یا
فقط سربار غیر ضروری را متحمل شوید. در این مورد، بهتر است از آن استفاده کنید
collections.deque به عنوان یک صف همه منظوره.from queue import Queue
q = Queue()
q.put(‘eat’)
q.put(‘sleep’)
q.put(‘code’)
q
q.get()
‘eat’
q.get()
‘sleep’
q.get()
‘code’
q.get_nowait()
queue.Empty
q.get()Blocks / waits forever…
multiprocessing.Queue – صف های شغلی مشترک
این یک اجرای صف کار مشترک است که به موارد در صف اجازه می دهد
به طور موازی توسط چندین کارگر همزمان پردازش شود.38 موازی سازی مبتنی بر فرآیند در CPython به دلیل قفل جهانی تعبیر کننده (GIL) که از برخی اشکال اجرای موازی در یک دستگاه جلوگیری می کند، محبوب است.
فرآیند مترجم واحد
به عنوان یک پیاده سازی صف تخصصی برای به اشتراک گذاری داده ها
بین فرآیندها، multiprocessing.Queue توزیع کار را در چندین فرآیند به منظور کار در اطراف آسان می کند.
محدودیت های GIL این نوع صف می تواند هر کدام را ذخیره و انتقال دهد
شیء قابل ترشی در سراسر مرزهای فرآیند.
قوانین ارسال دیدگاه در سایت