পাইথন তালিকা কত বড় পেতে পারে?


119

পাইথনে, একটি তালিকা কত বড় পেতে পারে? আমার প্রায় 12000 উপাদানগুলির একটি তালিকা দরকার। আমি কী এখনও তালিকা পদ্ধতি বাছাই করতে সক্ষম করব যেমন বাছাই ইত্যাদি?

উত্তর:


193

উত্স কোড অনুসারে , একটি তালিকার সর্বাধিক আকার 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 টি উপাদান।

যতক্ষণ আপনার কাছে উপাদানগুলির সংখ্যা সমান বা এর নীচে থাকে, সমস্ত তালিকা ফাংশন সঠিকভাবে পরিচালনা করা উচিত।


4
কেন sizeof(PyObject*) == 4?? এটি কী উপস্থাপন করে?
ম্যাট

4
@ ম্যাট, একটি একক বাইটের সংখ্যা PyObject *। এই জিনিসটি একটি তথাকথিত পয়েন্টার (আপনি শেষের দিকে অ্যাসট্রিক্সের কারণে এগুলি সনাক্ত করেন)। পয়েন্টারগুলি 4 বাইট দীর্ঘ এবং বরাদ্দ হওয়া অবজেক্টে একটি মেমরি ঠিকানা সঞ্চয় করে। এগুলি "কেবল" 4 বাইট দীর্ঘ কারণ 4 আজকের কম্পিউটারগুলির স্মৃতিতে আপনি প্রতিটি উপাদানকে সম্বোধন করতে পারেন 4 বাইট দ্বারা।
আন্তোনিও রাগাগনিন

1
এটি লক্ষণীয় (যেমন এলভারো জাস্টেনের উত্তরটি ইঙ্গিত করে) অন্যান্য মেশিনে, বিশেষত those৪-বিট সিস্টেম চলমান, এর মান PY_SSIZE_T_MAXখুব বড় পরিমাণে হতে পারে।
ক্লাইডেঘস্ট

ক্লাইডডেগোস্ট, আপনি কি specify৪6,৮70০,৯১২ উপাদানগুলির চেয়ে maximum৪-বিট সিস্টেমে চলমান those৪-বিট সিস্টেমের সর্বাধিক আকারের আকার কম রাখতে পারবেন কিনা তা নির্দিষ্ট করতে পারেন? বা এগুলি যে ব্যাপকভাবে পরিবর্তিত হতে পারে, তবুও সর্বদা একটি সর্বাধিক আকার থাকে যা 536,870,912 উপাদানগুলির চেয়ে সমান- বা বড়?

1
@at একটি 64৪-বিট সিস্টেমের জন্য সর্বদা সর্বোচ্চ 32-বিট সিস্টেমের তুলনায় সমান বা বড় হবে।
ক্লাইডেঘস্ট

71

পাইথন ডকুমেন্টেশন যেমন বলে :

sys.maxsize

প্ল্যাটফর্মের পাই_এসাইজ_টি টাইপ দ্বারা সমর্থিত বৃহত্তম ধনাত্মক পূর্ণসংখ্যা এবং এভাবে সর্বাধিক আকারের তালিকা, স্ট্রিং, ডিক্টস এবং অন্যান্য অনেক ধারক থাকতে পারে।

আমার কম্পিউটারে (লিনাক্স x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807

এই প্রশ্নের উত্তরটি কীভাবে দেয়
এলডিগোর্মান

11
@ldgorman, sys.maxsizeপ্রশ্নের উত্তর। বিভিন্ন আর্কিটেকচার বিভিন্ন ম্যাক্সিমাকে সমর্থন করে।
সাইমন কুয়াং

2
9223372036854775807 উপাদান? সত্যি? এটি সর্বাধিক উত্সাহিত উত্তর থেকেও ব্যাপকভাবে পরিবর্তিত হয়।
আক্কি

13
@ কাকী গৃহীত উত্তরটি একটি 32 বিট সিস্টেমকে উল্লেখ করছে। যেহেতু এটি ২০১ 2016, তাই আমি ধরে নেব যে আপনি একটি bit৪ বিট সিস্টেমে আছেন এবং উত্তরটি তাই সঠিক
ব্রায়ান লিচ

2
এটি উত্তর নির্বাচন করা উচিত।
লোকেশ

26

অবশ্যই ঠিক আছে। আসলে আপনি নিজের জন্য সহজেই দেখতে পাবেন:

l = range(12000)
l = sorted(l, reverse=True)

আমার মেশিনে এই লাইনগুলি চালানোতে:

real    0m0.036s
user    0m0.024s
sys  0m0.004s

তবে সবার মতোই নিশ্চিত। যত বড় অ্যারে তত বেশি ধীরে ধীরে অপারেশনগুলি হবে।


20
এই সময়টি বিভ্রান্তিকর হতে পারে - বেশিরভাগ সময় পাইথন ইন্টারপ্রেটার শুরু করে ব্যয় করা হয়। আরও ভাল উপায় হ'ল পাইথন-মি টাইমিট.পি "l = রেঞ্জ (12000); l = সাজানো (l, বিপরীত = সত্য)"। আমার মেশিনে এটি উদাহরণের জন্য প্রায় 1/20 তম সময় দেয়।
ডিএফ।

5
@ ডিএফ, আপনি সঠিকতার বিষয়ে ঠিক বলেছেন। এটা লক্ষ করার জন্য ধন্যবাদ। আমি শুধু একটি বিষয় প্রমাণ করতে চেয়েছিলেন। এবং উদাহরণ এটি প্রমাণ করে।
নাদিয়া আলরামলি

13
@ ডিএফ: দুর্দান্ত! 0.024s আমার জন্য অনেক দীর্ঘ ছিল এবং আমি আনন্দিত যে আমি এখনই এটি নিয়ে চিন্তাভাবনা বন্ধ করতে পারি I'm
থমাস এডলসন

6

নৈমিত্তিক কোডে আমি লক্ষ লক্ষ উপাদানগুলির সাথে তালিকা তৈরি করেছি। আমি বিশ্বাস করি যে পাইথনের তালিকাগুলি বাস্তবায়ন কেবলমাত্র আপনার সিস্টেমে মেমরির পরিমাণেই আবদ্ধ।

এছাড়াও তালিকার আকার থাকা সত্ত্বেও তালিকার পদ্ধতিগুলি / ক্রিয়াকলাপগুলি চালিয়ে যাওয়া উচিত।

আপনি যদি পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে নুমপির মতো লাইব্রেরিটি সন্ধান করা সার্থক হতে পারে ।


5

তালিকাগুলির জন্য পারফরম্যান্স বৈশিষ্ট্যগুলি এফবোটে বর্ণিত হয়।

পাইথন তালিকাগুলি প্রকৃতপক্ষে দ্রুত এলোমেলো অ্যাক্সেসের জন্য ভেক্টর হিসাবে প্রয়োগ করা হয়, তাই কন্টেইনারটি মূলত মেমোরির জায়গাগুলি যতগুলি আইটেম রাখে। (আপনার তালিকায় থাকা পয়েন্টারগুলির পাশাপাশি স্থানের জন্য মেমোরিতে স্থান প্রয়োজন বস্তুর (গুলি) এর দিকে নির্দেশ করা হচ্ছে))

সংযোজন O(1)(নিয়মিত ধ্রুবক জটিলতা), তবে সিকোয়েন্সের মাঝামাঝি থেকে সরিয়ে / মুছে ফেলার জন্য একটি O(n)(রৈখিক জটিলতা) পুনর্নির্মাণের প্রয়োজন হবে , যা আপনার তালিকার উপাদানগুলির সংখ্যা হিসাবে ধীরে ধীরে পাবেন।

আপনার বাছাইয়ের প্রশ্নটি আরও অযৌক্তিক, যেহেতু তুলনা ক্রিয়াকলাপটি সীমাহীন সময় নিতে পারে। যদি আপনি সত্যিই ধীর তুলনা করছেন তবে এটি দীর্ঘ সময় নিতে পারে, যদিও পাইথনের তালিকার ডেটা ধরণের কোনও দোষ নেই ।

বিপরীতে তালিকার সমস্ত পয়েন্টার অদলবদল করতে প্রয়োজনীয় পরিমাণের পরিমাণ লাগে (প্রয়োজনীয়ভাবে O(n)(লিনিয়ার জটিলতা), যেহেতু আপনি প্রতিটি পয়েন্টার একবার স্পর্শ করেন)।


4

পাইথনে 12000 উপাদান কিছুই নয় ... এবং পাইথন ইন্টারপ্রেটারের আপনার সিস্টেমে মেমরি রয়েছে ততোধিক উপাদানগুলির সংখ্যা যেতে পারে।


3

এটি বিভিন্ন সিস্টেমে পরিবর্তিত হয় (র‌্যামের উপর নির্ভর করে)। এটির সন্ধানের সবচেয়ে সহজ উপায়

import six six.MAXSIZE 9223372036854775807 এটি এর সর্বোচ্চ আকার দেয় listএবং dictখুব, অনুযায়ী ডকুমেন্টেশন


1
এটি ডকুমেন্টেশন নয়
বোরিস

1

আমি বলতে চাই আপনি কেবলমাত্র মোট র্যাম উপলব্ধ দ্বারা সীমাবদ্ধ। স্পষ্টতই অ্যারেটি যত বড় হবে এটিতে আরও বেশি অপারেশন লাগবে।


4
সাধারণত সত্য, তবে তাদের সবকটিই নয় - সংযোজন অ্যারির আকারের তুলনায় অবিচ্ছিন্ন ধ্রুবক সময় থেকে যায়।
সিডলারি

0

আমি এটি এখান থেকে একটি x64 বিট সিস্টেমে পেয়েছি: পাইথন 3.7.0b5 (v3.7.0b5: abb8802389, মে 31 2018, 01:54:01) [উইন 32 এ এমএসসি ভি.1913 64 বিট (এএমডি 64)]

এখানে চিত্র বর্ণনা লিখুন


1
আপনি বিশদ এবং অন্যরা কীভাবে তাদের নিজস্ব সীমাটি সন্ধান করতে পারে সে সম্পর্কে যদি আপনি কিছুটা প্রসারিত করেন তবে এটি দুর্দান্ত উত্তর হবে।
শায়ান

-16

তালিকা সংখ্যার সীমাবদ্ধতা নেই। আপনার ত্রুটির কারণ হওয়ার প্রধান কারণটি হল র্যাম। আপনার স্মৃতি আকার আপগ্রেড করুন।


9
-1 কারণ এটি আসলে প্রশ্নের উত্তর দেয় না এবং প্রকৃতপক্ষে বিভ্রান্তিমূলক কারণ (অন্যান্য উত্তরগুলির দ্বারা দেখানো হয়েছে) তালিকার প্রকৃতপক্ষে সর্বোচ্চ আকার রয়েছে।
ক্লাইডেঘস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.