পাইথনে খুব সংখ্যক লোককে পরিচালনা করা


140

আমি পাইথনে দ্রুত পোকার হ্যান্ড মূল্যায়ন বিবেচনা করছি। আমার কাছে এটি ঘটেছে যে প্রক্রিয়াটি গতি বাড়ানোর এক উপায় হ'ল সমস্ত কার্ডের মুখ এবং স্যুটগুলিকে প্রাইম সংখ্যা হিসাবে উপস্থাপন করা এবং তাদের হাতের প্রতিনিধিত্ব করতে একসাথে বহুগুণ করা। ঝকঝকে:

class PokerCard:
    faces = '23456789TJQKA'
    suits = 'cdhs'
    facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
    suitPrimes = [2, 3, 5, 7]

এবং

    def HashVal(self):
      return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]

এটি প্রতিটি হাতকে এমন একটি সংখ্যাসূচক মূল্য দেবে যেটি মডুলোর মাধ্যমে আমাকে বলতে পারে যে কত রাজা হাতে আছেন বা কত হৃদয়। উদাহরণস্বরূপ, এতে পাঁচ বা ততোধিক ক্লাব সহ যে কোনও হাত সমানভাবে 2 ^ 5 দ্বারা বিভক্ত হবে; চার রাজার সাথে যে কোনও হাত 59 ^ 4 ইত্যাদি দ্বারা সমানভাবে ভাগ হবে would

সমস্যাটি হ'ল ACAdAhAsKdKhKs এর মতো একটি সাত-কার্ডের হাতের প্রায় 62.7 কোয়াড্রিলিয়ন এর একটি হ্যাশ মান রয়েছে, যা অভ্যন্তরীণভাবে উপস্থাপন করতে 32 বিটের চেয়ে বেশি সময় লাগবে। পাইথনে এত বড় সংখ্যক সঞ্চয় করার কোনও উপায় আছে যা আমাকে এতে গাণিতিক ক্রিয়াকলাপ সম্পাদন করার অনুমতি দেবে?


13
আপনি কি নিশ্চিত যে, একবার আপনি এইভাবে আপনার ডেটা উপস্থাপন শুরু করলে আপনি এখনও কোনও উল্লেখযোগ্য গতির উন্নতি দেখতে পাবেন? আমি বুঝতে পেরেছি এটি আপনার প্রশ্নের উত্তর দেয় না, তবে এখনও ..
থোমি

3
আমার একটি পরামর্শ আছে: কার্ডের মান এবং উপস্থাপনাগুলির জন্য পৃথক ভেরিয়েবল ব্যবহার না করে আমি অভিধান ব্যবহার করার পরামর্শ দিই। (সুতরাং মুখগুলি = {'2': 11, '3': 13, '4': 17, '5': 19, '6': 23, '7': 29, '8': 31, '9' : 37, 'টি': 41, 'জে': 43, 'কিউ': 53, 'কে': 59, 'এ': 61} এবং স্যুট = {'সি': 2, 'ডি': 3, ' এইচ ': 5,' এস ': 7}।)
জ্যাব

উত্তর:


177

পাইথন একটি "বিগনাম" পূর্ণসংখ্যার প্রকারকে সমর্থন করে যা নির্বিচারে বৃহত সংখ্যার সাথে কাজ করতে পারে। পাইথন ২.৫+ এ, এই ধরণের নামটি বলা হয় longএবং এটি intটাইপ থেকে পৃথক , তবে দোভাষী যেকোন উপযুক্ত তার থেকে স্বয়ংক্রিয়ভাবে ব্যবহার করবেন। পাইথন 3.0.০+ তে, intটাইপটি পুরোপুরি বাদ দেওয়া হয়েছে।

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

আপনি পিইপি 0237 এ সমস্ত বেহাল বিবরণ খুঁজে পেতে পারেন ।


2
প্রশ্নটি হল, 32 বিট ইন্টিজারের পরিবর্তে বিগনাম ব্যবহার করে পারফরম্যান্সটি কীভাবে ব্যবহার হচ্ছে তা হাতের মূল্যায়নের চতুর পদ্ধতি থেকে কার্যকারিতা উপকারের চেয়ে বেশি।
ক্রিস আপচর্চ

3
প্রকৃতপক্ষে, আন্ত এবং দীর্ঘের মধ্যে বাধাটি 2.5 এ ভাঙ্গা হয়েছিল। 3.0 একমাত্র পূর্ণসংখ্যার প্রকার তৈরি করে পুরোপুরি ইনট সরিয়ে দেয়।
ইগনাসিও ওয়াজকেজ-আব্রামস

1
বড় সংখ্যা কত বড়? এটি PHI ^ 4000000 হতে পারে?
মাইক ক্যারন

9
@ মাইক কারন - পিইপি 0237 এ তালিকাভুক্ত স্ট্রাক্টটি যদি সঠিক হয় তবে longএর দৈর্ঘ্য (অঙ্কগুলিতে) স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার হিসাবে 4,294,967,295 অঙ্ক পর্যন্ত সংরক্ষণ করা হয়, যার অর্থ তারা সহজেই φ ** (4 * 10 ** 6 ধরে রাখতে পারে) ), যা "কেবল" 832,951 ডিজিট। তবে, an একটি পূর্ণসংখ্যা নয়, সুতরাং আপনাকে সংখ্যাটি গণনা করতে একটি দশমিক (পাইথনের ভাসমান-বিন্দু বিগাইনাম) ব্যবহার করতে হবে । তবে ফলস্বরূপ আপনি longপরবর্তী সময়ে সংরক্ষণ করতে পারেন ।
বেন ফাঁকা

17
@ IgnacioVazquez-Abram স্পষ্টকরণের মাত্র একটি বিন্দু, long3.0 এ একমাত্র পূর্ণসংখ্যার প্রকার, তবে নামকরণ করা হয়েছে int। (এবং int
পুরানোটি

70

পাইথন সমর্থন ইচ্ছামত বড় পূর্ণসংখ্যার স্বাভাবিকভাবেই:

উদাহরণ:

>>>10 ** 1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000

এমনকি আপনি পেতে পারেন, উদাহরণস্বরূপ বিশাল সংখ্যার মান, ফাইব (4000000)।

কিন্তু তবুও এটি (আপাতত) একটি ইচ্ছামত বৃহত ভাসা সমর্থন করে না !!

আপনার যদি একটি বড়, বড়, ভাসমান প্রয়োজন হয় তবে দশমিক মডিউলটি দেখুন check এই foruns ব্যবহারের উদাহরণ রয়েছে: ওভারফ্লো এরিয়ার : (34, 'ফলাফল খুব বড়')

আরেকটি উল্লেখ: http://docs.python.org/2/library/decimal.html t

আপনার যদি গতি বাড়ানোর প্রয়োজন হয় তবে আপনি জিএমপি মডিউলটিও ব্যবহার করতে পারেন (যা আপনার আগ্রহের কারণ হতে পারে): কোডে বড় সংখ্যক পরিচালনা করা

অন্য একটি উল্লেখ: https://code.google.com/p/gmpy/


33

আপনি এটির মজাদার জন্য এটি করতে পারেন, তবে এটি ছাড়াও এটি ভাল ধারণা নয়। এটি আমি ভাবতে পারি এমন কোনও গতি বাড়ায় না।

  • কার্ড হাতে পাওয়ার জন্য একটি পূর্ণসংখ্যার ফ্যাক্টরিং অপারেশন হবে যা কেবলমাত্র অ্যারে অ্যাক্সেস করার চেয়ে অনেক বেশি ব্যয়বহুল।

  • কার্ড যুক্ত করা হ'ল গুণ, এবং কার্ড বিভাজন অপসারণ, উভয় বৃহত্তর বহু-শব্দ সংখ্যা, যা তালিকাগুলি থেকে উপাদানগুলি যোগ করার বা অপসারণের চেয়ে ব্যয়বহুল ক্রিয়াকলাপ।

  • কোনও হাতের আসল সংখ্যাসূচক মান আপনাকে কিছুই বলবে না। দুই হাতের তুলনা করার জন্য আপনাকে প্রাইমগুলিকে ফ্যাক্ট করতে হবে এবং পোকার বিধিগুলি অনুসরণ করতে হবে। এই জাতীয় হাতগুলির জন্য এইচ 1 <এইচ 2 এর অর্থ কিছুই নেই।


25

অজগর প্রাকৃতিকভাবে প্রাকৃতিকভাবে পূর্ণসংখ্যার সমর্থন করে:

In [1]: 59**3*61**4*2*3*5*7*3*5*7
Out[1]: 62702371781194950
In [2]: _ % 61**4
Out[2]: 0

3

অজগর দোভাষী এটি আপনার জন্য পরিচালনা করবেন, আপনাকে কেবল আপনার অপারেশনগুলি করতে হবে (+, -, *, /), এবং এটি স্বাভাবিক হিসাবে কাজ করবে।

intমান সীমাহীন।

বিভাগ করার সময় সাবধান, ডিফল্টরূপে ভাগফলটি রূপান্তরিত হয় floatতবে floatএত বড় সংখ্যক সমর্থন করে না। যদি আপনি একটি ত্রুটি বার্তা পেয়ে থাকেন যা বলছেন floatযে এত বড় সংখ্যক সমর্থন করে না, তবে এর অর্থ হ'ল ভাগফলটি খুব বেশি সঞ্চয় করতে পারা যায় না floatআপনি ফ্লোর বিভাগ ( //) ব্যবহার করতে হবে ।

দশমিক বিন্দুর পরে যে কোনও দশমিক আসে তা উপেক্ষা করে, এভাবে, ফলাফলটি হবে int, যাতে আপনি একটি বৃহত সংখ্যার ফলাফল পেতে পারেন।

10//3 আউটপুট 3

10//4 আউটপুট 2


1
আপনার উত্তর কীভাবে প্রশ্নে বড় সংখ্যা প্রকাশ করবে?
বোকা ওল্ফ

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