পাইথন কীভাবে দীর্ঘ এবং দীর্ঘ পরিচালনা করে?


118

পাইথন কীভাবে অভ্যন্তরীণ অভ্যন্তরীণ অভ্যন্তরীণ এবং দীর্ঘ প্রকার পরিচালনা করে তা কি কেউ জানেন?

  • এটি গতিশীলভাবে সঠিক টাইপটি চয়ন করে?
  • কোন int এর সীমা কত?
  • আমি পাইথন ২.6 ব্যবহার করছি, পূর্ববর্তী সংস্করণগুলির সাথে কি আলাদা?

নীচের কোডটি আমি কীভাবে বুঝতে পারি?

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

হালনাগাদ:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>

তারা কি সিপিথনের নীচে ফ্লাইতে স্টাডিসি ধরণের মানচিত্র তৈরি করে না?
আইডেন বেল

হ্যাঁ, আমি মনে করি তারা করে। আমি আরও সন্দেহ করি যে সমস্ত কিছু গাদা করে বরাদ্দ করা হয়েছে, সুতরাং যখন কোনও সংখ্যার আরও নির্ভুলতার প্রয়োজন হয় তখন তারা ঠিক reallocঠিক থাকে। তবে আমি বেশ নিশ্চিত নই, তাই আমি উত্তর অন্য কারও কাছে রেখে দেব।
zneak

2
আপনি var = 666L
পাইথনকে

8
@ ইগনাসিও: ভুল একটি সিপিথন intএকটি সি long(ডিফল্ট স্বাক্ষরিত) ... দেখুন <CPython 2.X source>/Include/intobject.h: টাইপডেফ স্ট্রাক্ট {পাইওবজেক্ট_এইডি লম্বা ওবাইভাল; } পাইআইন্টবজেক্ট; যে কোনও ক্ষেত্রে পাইথন ২.x intনেতিবাচক সংখ্যার অনুমতি দেয়; একটি সি unsignedঠিক সামলাতে হবে না।
জন মাচিন 20'10

পিইপি 237 আলোচনা করে যে কীভাবে হুডের নীচে পাইথনকে বোঝা যাচ্ছে যে এগুলি সমস্তকে একই রকম করা।
ক্যারেল

উত্তর:


124

int এবং long কয়েকটি সংস্করণ ফিরে "একীভূত" হয়েছিল । এর আগে গণিতের মাধ্যমে কোনও int উপচে পড়া সম্ভব ছিল।

3.x সম্পূর্ণরূপে দীর্ঘকে সরিয়ে এবং কেবল অন্তর্নিহিত করে আরও এগিয়েছে।

  • পাইথন 2 :sys.maxint পাইথন ইন্টটি ধারণ করতে পারে সর্বোচ্চ মান contains
    • 64৪-বিট পাইথন ২.7-এ, আকারটি 24 বাইট। সঙ্গে পরীক্ষা করুন sys.getsizeof()
  • পাইথন 3 :sys.maxsize পাইথন ইনট হতে পারে বাইটে সর্বাধিক আকার ধারণ করে।
    • এটি 32 বিটগুলিতে গিগাবাইট এবং 64 বিটে এক্সাবাইট হবে।
    • এ জাতীয় বৃহত্তর সংখ্যার পাওয়ার মান 8 এর সমান মান হবে sys.maxsize

30
তবে পাইথন 3 এই ধরণেরটিকে 'ইনট' বলে, যদিও এটি 2.x এর 'লম্বা'র মতো আচরণ করে।

3
টেডের মন্তব্য: নীচে উল্লিখিত হিসাবে সাবধান থাকুন যে ম্যাক্সিন্টের চেয়ে বড় কিছুতে castালাইয়ের ফলস্বরূপ দীর্ঘ >>> টাইপ (int (sys.maxint + 1)) <টাইপ 'দীর্ঘ'>
স্টুয়ার্টলসি

2
sys.maxint আপনাকে সবচেয়ে বড় bit৪ বিট পূর্ণসংখ্যা দেবে (আমার bit৪ বিট মেশিনে) একটি লম্বা অনেক বেশি হতে পারে যে bits৪ বিট, কেবল "sys.maxint << 1000000" চেষ্টা করুন
fccoelho

4
পাইথন 3 এ এটি সিস.ম্যাক্সেসাইজ
পাইওভার

3
sys.maxsize এর পূর্ণসংখ্যার সাথে কোনও সম্পর্ক নেই। পাইথন 3 এর sys.maxint সরানো হয়েছে কারণ কোনও পূর্ণসংখ্যার জন্য সর্বোচ্চ আকার নেই (পাইথন 3 এর intপাইথন 2 এর সমান long)।
asmeurer

19

এই পিইপি সাহায্য করা উচিত।

নীচের লাইনটি আপনাকে পাইথন সংস্করণ> ২.৪ এ সত্যই চিন্তা করতে হবে না


15
আপনাকে সিটিতে কোনও ইনট ফাংশনটি কল করতে হবে যা এমন কোনও কিছু যা ইনট (উপযুক্ত) হিসাবে মানাবে না। দীর্ঘ পরিমাণে ingালাই-> ইন্ট সাহায্য করবে না। আমার সাথে সম্প্রতি ঘটেছে।
ম্যাক

1
@ ম্যাক: এই মন্তব্যটি আমাকে বাঁচিয়েছে, আমি ধরে নিয়েছি যে কৌশলটি কৌশলটি করবে এবং আমি এখনও কেন জাইথন ​​ব্যতিক্রম পাচ্ছি তা ভাবছিলাম।
টেড হয়েছে

@ ম্যাক একেবারে সত্য। বর্তমানে আমি যে কোম্পানিতে কাজ করি সেখানে পাইথনে লিখিত একটি সিমুলেটর রয়েছে যা টিন্টার এন্ট্রিগুলির মাধ্যমে ব্যবহারকারীদের ইনপুট নেয় এবং একটি ক্লায়েন্টের (সি / সি ++ তে লিখিত) ক্লাস্টিকে (সি / সি ++ তে লিখিত) পাঠানো মানগুলি প্রেরণ করে যা এম্বেড থাকা সিস্টেমের নকল করে। আপনার পাইথন-ভিত্তিক এন্ট্রি 100000000000000000000000000
whenোকানোর পরে

@ ম্যাকি ভাল আপনি যদি পিইপি পড়তে আসলে বিরক্ত হন তবে এটি স্পষ্টভাবে বলে: সিআইপি অপরিবর্তিত রয়েছে; সি কোডটি এখনও ছোট এবং দীর্ঘ ints মধ্যে পার্থক্য সম্পর্কে সচেতন করা প্রয়োজন। (পাইথন 3.0.০ সি এপিআই সম্ভবত পুরোপুরি বেমানান হবে)) পাইআআরগ_পর্স * () এপিআইগুলি যতক্ষণ না সি ইনট বা লং দ্বারা প্রতিনিধিত্বযোগ্য সীমার মধ্যে থাকে ততক্ষণ দীর্ঘ ইনট গ্রহণ করে, যাতে সি ইনট বা দীর্ঘ আর্গুমেন্ট গ্রহণকারী ফাংশনগুলি জিতে যায় ' পাইথন দীর্ঘায়ু নিয়ে কাজ করার বিষয়ে চিন্তা করতে হবে না।
কাওবার্ট

4

আমার মেশিনে:

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

পাইথন ইনট ব্যবহার করে (32 বিট স্বাক্ষরিত পূর্ণসংখ্যা, আমি জানি না যে সেগুলি হুডের নীচে সি ইনটগুলি রয়েছে কিনা) 32 টি বিটের মধ্যে মানগুলির জন্য, তবে স্বয়ংক্রিয়ভাবে দীর্ঘস্থায়ীগুলিতে স্যুইচ করে (যথেচ্ছ সংখ্যায় বিটগুলি - অর্থাত্ বিগনামস) কোনও কিছুর জন্য sw বড় করা হয়েছে। বিনগুয়ামগুলিতে নির্বিঘ্ন ট্রান্সফার সহ কোনও অতিরিক্ত প্রবাহ এড়াতে আমি এই ছোট জিনিসগুলিকে ছোট মানগুলির জন্য অনুমান করছি।


4

মজাদার. আমার 64-বিট (আই 7 উবুন্টু) বাক্সে:

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

অনুমান করুন এটি বড় মেশিনে on৪ বিট ইনট পর্যন্ত পদক্ষেপ নিয়েছে।


2
পাইথন মেশিনের জন্য বৃহত্তর পূর্ণসংখ্যার প্রকার উপলব্ধ able সাধারণত 32-বিট মেশিনগুলিতে 32 বিট আকার ধারণ করতে পারে, যখন 64 বিট-মেশিনে এটির 64 বিট আকার থাকে। তবে 32-বিট আর্কিটেকচারগুলি 64 বিট পূর্ণসংখ্যা সংজ্ঞায়িত করতে পারে, সেক্ষেত্রে অজগর 64-বিট পূর্ণসংখ্যা ব্যবহার করবে।
বাকুরিউ

4

পাইথন ২.7.৯ অটো সংখ্যার প্রচার করে। এমন ক্ষেত্রে যেখানে কেউ ইন্টার () বা দীর্ঘ () ব্যবহারের বিষয়ে অনিশ্চিত।

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

4

পাইথন 2 মান আকারের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে টাইপ সেট করবে। সর্বোচ্চ মানগুলির একটি গাইড নীচে পাওয়া যাবে।

পাইথন 2 এ ডিফল্ট ইনটেলের সর্বোচ্চ মান 65535, এটির উপরে যে কোনও কিছুই দীর্ঘ হবে

উদাহরণ স্বরূপ:

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

পাইথন 3 এ দীর্ঘ ডেটাটাইপ সরানো হয়েছে এবং সমস্ত পূর্ণসংখ্যা মানগুলি আন্ত শ্রেণীর দ্বারা পরিচালিত হয়। ইন্টের ডিফল্ট আকার আপনার সিপিইউ আর্কিটেকচারের উপর নির্ভর করবে।

উদাহরণ স্বরূপ:

  • পূর্ণসংখ্যার জন্য ডিফল্ট ডেটাটাইপ 32 বিট সিস্টেমগুলি 'ইন্টার 32' হবে
  • পূর্ণসংখ্যার জন্য ডিফল্ট ডেটাটাইপ 64৪ বিট সিস্টেমগুলি হবে 'ইন্টার64'

প্রতিটি ধরণের নূন্যতম / সর্বোচ্চ মানগুলি নীচে পাওয়া যাবে:

  • ইন্ট 8: [-128,127]
  • অন্তঃ 16: [-32768,32767]
  • ইন্ট 32: [-2147483648,2147483647]
  • ইন্টার64: [-9223372036854775808,9223372036854775807]
  • ইন্টার 128: [-170141183460469231731687303715884105728,170141183460469231731687303715884105727]
  • ইউআইএনটি 8: [0,255]
  • UInt16: [0,65535]
  • ইউআইএনটি 32: [0,4294967295]
  • ইউআইএনটি 64: [0,18446744073709551615]
  • ইউআইএনটি 128: [0,340282366920938463463374607431768211455]

যদি আপনার ইন্টের আকারটি উপরে বর্ণিত সীমা অতিক্রম করে, অজগরটি স্বয়ংক্রিয়ভাবে এর প্রকারটি পরিবর্তন করবে এবং ন্যূনতম / সর্বোচ্চ মানগুলিতে এই বৃদ্ধিটি পরিচালনা করতে আরও মেমরি বরাদ্দ করবে। পাইথন ২-এ যেখানে এটি 'লম্বা' রূপান্তরিত হবে, এটি এখন কেবলমাত্র আন্তের পরবর্তী আকারে রূপান্তরিত হবে।

উদাহরণ: আপনি যদি একটি 32 বিট অপারেটিং সিস্টেম ব্যবহার করছেন, তবে আপনার কোনও আন্তের মান সর্বাধিক 2147483647 হয়ে যাবে default যদি 2147483648 বা তারও বেশি মান নির্ধারিত হয় তবে টাইপটি Int64 এ পরিবর্তিত হবে।

ইন্টের আকার চেক করার বিভিন্ন উপায় রয়েছে এবং এটির মেমরি বরাদ্দ। দ্রষ্টব্য: পাইথন 3-এ, বিল্ট-ইন টাইপ () পদ্ধতিটি ব্যবহার করে সর্বদা <class 'int'>আপনি যে আকারের ইন্ট ব্যবহার করছেন তা ফিরে আসবে ।


1

পাইথন ৩.x থেকে, ইউনিফাইড ইন্টিজার লাইব্রিজগুলি পুরানো সংস্করণগুলির চেয়ে আরও বেশি স্মার্ট। আমার (i7 উবুন্টু) বাক্সে আমি নিম্নলিখিতটি পেয়েছি,

>>> type(math.factorial(30))
<class 'int'>

প্রয়োগের বিশদগুলির জন্য Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.cফাইলগুলি পড়ুন । শেষ ফাইলটি একটি গতিশীল মডিউল (একটি ফাইলের সাথে সংকলিত)। কোড অনুসরণ করতে ভাল মন্তব্য করা হয়।


1

এখানে দেওয়া সমস্ত উত্তরগুলি অবিরত রাখতে বিশেষত @ জেমস লেনস

পূর্ণসংখ্যার ধরণের আকার এই সূত্র দ্বারা প্রকাশ করা যেতে পারে:

মোট ব্যাপ্তি = (2 ^ বিট সিস্টেম)

নিম্ন সীমা = - (2 ^ বিট সিস্টেম) * 0.5 উচ্চতর সীমা = ((2 ^ বিট সিস্টেম) * 0.5) - 1


0

এটি তাদের পরিচালনা করে কারণ intএবংlong সহোদর শ্রেণির সংজ্ঞা রয়েছে। তাদের কাছে +, -, *, / ইত্যাদি ইত্যাদির জন্য উপযুক্ত পদ্ধতি রয়েছে যা উপযুক্ত শ্রেণীর ফলাফল আনবে।

উদাহরণ স্বরূপ

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

এই ক্ষেত্রে, শ্রেণীর intএকটি __mul__পদ্ধতি রয়েছে (যা প্রয়োগ করে *) যা longপ্রয়োজনে ফলাফল তৈরি করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.