উত্তর:
উত্স কোড অনুসারে , একটি তালিকার সর্বাধিক আকার PY_SSIZE_T_MAX/sizeof(PyObject*)
।
PY_SSIZE_T_MAX
হতে pyport.h সংজ্ঞায়িত করা হয়((size_t) -1)>>1
নিয়মিত 32 বিট সিস্টেমে এটি (4294967295/2) / 4 বা 536870912।
সুতরাং 32 বিট সিস্টেমে পাইথন তালিকার সর্বাধিক আকার 536,870,912 টি উপাদান।
যতক্ষণ আপনার কাছে উপাদানগুলির সংখ্যা সমান বা এর নীচে থাকে, সমস্ত তালিকা ফাংশন সঠিকভাবে পরিচালনা করা উচিত।
PyObject *
। এই জিনিসটি একটি তথাকথিত পয়েন্টার (আপনি শেষের দিকে অ্যাসট্রিক্সের কারণে এগুলি সনাক্ত করেন)। পয়েন্টারগুলি 4 বাইট দীর্ঘ এবং বরাদ্দ হওয়া অবজেক্টে একটি মেমরি ঠিকানা সঞ্চয় করে। এগুলি "কেবল" 4 বাইট দীর্ঘ কারণ 4 আজকের কম্পিউটারগুলির স্মৃতিতে আপনি প্রতিটি উপাদানকে সম্বোধন করতে পারেন 4 বাইট দ্বারা।
PY_SSIZE_T_MAX
খুব বড় পরিমাণে হতে পারে।
পাইথন ডকুমেন্টেশন যেমন বলে :
sys.maxsize
প্ল্যাটফর্মের পাই_এসাইজ_টি টাইপ দ্বারা সমর্থিত বৃহত্তম ধনাত্মক পূর্ণসংখ্যা এবং এভাবে সর্বাধিক আকারের তালিকা, স্ট্রিং, ডিক্টস এবং অন্যান্য অনেক ধারক থাকতে পারে।
আমার কম্পিউটারে (লিনাক্স x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
প্রশ্নের উত্তর। বিভিন্ন আর্কিটেকচার বিভিন্ন ম্যাক্সিমাকে সমর্থন করে।
অবশ্যই ঠিক আছে। আসলে আপনি নিজের জন্য সহজেই দেখতে পাবেন:
l = range(12000)
l = sorted(l, reverse=True)
আমার মেশিনে এই লাইনগুলি চালানোতে:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
তবে সবার মতোই নিশ্চিত। যত বড় অ্যারে তত বেশি ধীরে ধীরে অপারেশনগুলি হবে।
নৈমিত্তিক কোডে আমি লক্ষ লক্ষ উপাদানগুলির সাথে তালিকা তৈরি করেছি। আমি বিশ্বাস করি যে পাইথনের তালিকাগুলি বাস্তবায়ন কেবলমাত্র আপনার সিস্টেমে মেমরির পরিমাণেই আবদ্ধ।
এছাড়াও তালিকার আকার থাকা সত্ত্বেও তালিকার পদ্ধতিগুলি / ক্রিয়াকলাপগুলি চালিয়ে যাওয়া উচিত।
আপনি যদি পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে নুমপির মতো লাইব্রেরিটি সন্ধান করা সার্থক হতে পারে ।
তালিকাগুলির জন্য পারফরম্যান্স বৈশিষ্ট্যগুলি এফবোটে বর্ণিত হয়।
পাইথন তালিকাগুলি প্রকৃতপক্ষে দ্রুত এলোমেলো অ্যাক্সেসের জন্য ভেক্টর হিসাবে প্রয়োগ করা হয়, তাই কন্টেইনারটি মূলত মেমোরির জায়গাগুলি যতগুলি আইটেম রাখে। (আপনার তালিকায় থাকা পয়েন্টারগুলির পাশাপাশি স্থানের জন্য মেমোরিতে স্থান প্রয়োজন বস্তুর (গুলি) এর দিকে নির্দেশ করা হচ্ছে))
সংযোজন O(1)
(নিয়মিত ধ্রুবক জটিলতা), তবে সিকোয়েন্সের মাঝামাঝি থেকে সরিয়ে / মুছে ফেলার জন্য একটি O(n)
(রৈখিক জটিলতা) পুনর্নির্মাণের প্রয়োজন হবে , যা আপনার তালিকার উপাদানগুলির সংখ্যা হিসাবে ধীরে ধীরে পাবেন।
আপনার বাছাইয়ের প্রশ্নটি আরও অযৌক্তিক, যেহেতু তুলনা ক্রিয়াকলাপটি সীমাহীন সময় নিতে পারে। যদি আপনি সত্যিই ধীর তুলনা করছেন তবে এটি দীর্ঘ সময় নিতে পারে, যদিও পাইথনের তালিকার ডেটা ধরণের কোনও দোষ নেই ।
বিপরীতে তালিকার সমস্ত পয়েন্টার অদলবদল করতে প্রয়োজনীয় পরিমাণের পরিমাণ লাগে (প্রয়োজনীয়ভাবে O(n)
(লিনিয়ার জটিলতা), যেহেতু আপনি প্রতিটি পয়েন্টার একবার স্পর্শ করেন)।
এটি বিভিন্ন সিস্টেমে পরিবর্তিত হয় (র্যামের উপর নির্ভর করে)। এটির সন্ধানের সবচেয়ে সহজ উপায়
import six
six.MAXSIZE
9223372036854775807
এটি এর সর্বোচ্চ আকার দেয় list
এবং dict
খুব, অনুযায়ী ডকুমেন্টেশন
আমি বলতে চাই আপনি কেবলমাত্র মোট র্যাম উপলব্ধ দ্বারা সীমাবদ্ধ। স্পষ্টতই অ্যারেটি যত বড় হবে এটিতে আরও বেশি অপারেশন লাগবে।
আমি এটি এখান থেকে একটি x64 বিট সিস্টেমে পেয়েছি: পাইথন 3.7.0b5 (v3.7.0b5: abb8802389, মে 31 2018, 01:54:01) [উইন 32 এ এমএসসি ভি.1913 64 বিট (এএমডি 64)]
তালিকা সংখ্যার সীমাবদ্ধতা নেই। আপনার ত্রুটির কারণ হওয়ার প্রধান কারণটি হল র্যাম। আপনার স্মৃতি আকার আপগ্রেড করুন।
sizeof(PyObject*) == 4?
? এটি কী উপস্থাপন করে?