এমন কি প্রযুক্তিগত সীমাবদ্ধতা বা ভাষার বৈশিষ্ট্য রয়েছে যা আমার পাইথন স্ক্রিপ্টকে সমতুল্য C ++ প্রোগ্রামের মতো দ্রুত হতে বাধা দেয়?


10

আমি দীর্ঘকালীন পাইথন ব্যবহারকারী। কয়েক বছর আগে, গতির দিক থেকে এটি কী প্রস্তাব দিতে পারে তা দেখতে আমি সি ++ শিখতে শুরু করেছি। এই সময়ে, আমি পাইথনকে প্রোটোটাইপিংয়ের সরঞ্জাম হিসাবে ব্যবহার করতে থাকব। এটি মনে হয়েছিল, এটি একটি ভাল ব্যবস্থা ছিল: পাইথনের সাথে চৌকস বিকাশ, সি ++ তে দ্রুত কার্যকরকরণ।

সম্প্রতি, আমি পাইথনকে আরও বারবার ব্যবহার করেছি এবং ভাষা নিয়ে আমার আগের বছরগুলিতে আমি যে দ্রুতগতি এবং অ্যান্টি-প্যাটার্নগুলি ব্যবহার করতে তাত্ক্ষণিকভাবে এড়াতে পারি তা শিখছি। এটি আমার বোঝার বিষয় যে নির্দিষ্ট বৈশিষ্ট্যগুলি (তালিকার বোঝাপড়া, গণনা ইত্যাদি) ব্যবহার করে কর্মক্ষমতা বাড়িয়ে তুলতে পারে।

কিন্তু এমন কি প্রযুক্তিগত সীমাবদ্ধতা বা ভাষার বৈশিষ্ট্য রয়েছে যা আমার পাইথন স্ক্রিপ্টকে সমতুল্য সি ++ প্রোগ্রামের মতো দ্রুত হতে বাধা দেয়?


2
হ্যা পারি. পাইথন সংকলকগুলিতে শিল্পের রাজ্যের জন্য পিপিপি দেখুন ।
গ্রেগ হিউগিল 20

5
পাইথনের সমস্ত ভেরিয়েবলগুলি বহুমুখী অর্থ যা ভেরিয়েবলের ধরণটি কেবল রানটাইমের সময় জানা যায়। আপনি যদি দেখতে চান (পূর্ণসংখ্যা ধরে) x + y সি-জাতীয় ভাষায় তারা পূর্ণসংখ্যা যোগ করে। পাইথনে x এবং y তে চলক প্রকারের উপর একটি সুইচ থাকবে এবং তারপরে উপযুক্ত সংযোজন ফাংশনটি নির্বাচন করা হবে এবং তারপরে একটি ওভারফ্লো চেক হবে এবং তারপরে সংযোজন হবে। অজগর স্ট্যাটিক টাইপিং না শিখলে এই ওভারহেড কখনই চলে যাবে না।
nwp

1
@ এনডব্লু না, এটি পিপিআই দেখতে সহজ। ট্রিকায়ার, এখনও খোলা, সমস্যাগুলির মধ্যে রয়েছে: কীভাবে জেআইটি সংকলকগণের সূচনা বিলম্বকে কাটিয়ে উঠতে হবে, কীভাবে জটিল দীর্ঘকালীন অবজেক্ট গ্রাফের জন্য বরাদ্দ এড়ানো যায় এবং কীভাবে সাধারণভাবে ক্যাশের ভাল ব্যবহার করা যায়।

উত্তর:


11

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

কঠোর পাইথনিস্টগুলি আমাকে সংশোধন করতে পারে, তবে এখানে আমি যে জিনিসগুলি পেয়েছি তা এখানে খুব বিস্তৃত স্ট্রোকে আঁকা।

  • পাইথন মেমরির ব্যবহার এক ধরণের ভীতিজনক। পাইথন হ'ল ডিক হিসাবে সমস্ত কিছু উপস্থাপন করে - যা অত্যন্ত শক্তিশালী, তবে এর ফলস্বরূপ রয়েছে যে এমনকি সাধারণ ডেটা প্রকারগুলিও বিশাল। আমি মনে করি "ক" অক্ষরটি মেমরির 28 বাইট নিয়েছিল। আপনি যদি পাইথনে বড় ডেটা স্ট্রাকচার ব্যবহার করছেন তবে নপি বা স্কিপির উপর নির্ভর করার বিষয়টি নিশ্চিত করুন, কারণ সেগুলি সরাসরি বাইট-অ্যারে প্রয়োগের দ্বারা সমর্থনযুক্ত।

এটির একটি পারফরম্যান্স প্রভাব রয়েছে, কারণ এর অর্থ অন্যান্য রানগুলির তুলনায় প্রচুর পরিমাণে স্মৃতিচারণের পাশাপাশি রান চলাকালীন অতিরিক্ত স্তরের ইন্ডিয়ারেশান রয়েছে।

  • পাইথনের একটি গ্লোবাল ইন্টারপ্রেটার লক রয়েছে যার অর্থ বেশিরভাগ অংশে প্রক্রিয়াগুলি একক থ্রেডযুক্ত চলছে। গ্রন্থাগারগুলি থাকতে পারে যা প্রক্রিয়াগুলি জুড়ে কাজগুলি বিতরণ করে তবে আমরা আমাদের পাইথন স্ক্রিপ্টের 32 বা তত্সহ উদাহরণগুলি সজ্জিত করে প্রতিটি একক থ্রেডেড চালাচ্ছি।

অন্যরা এক্সিকিউশন মডেলের সাথে কথা বলতে পারে, তবে পাইথন একটি সংকলন-এ-রানটাইম এবং তারপরে ব্যাখ্যা করা হয় যার অর্থ এটি মেশিন কোডে সমস্তভাবে যায় না। এটির একটি পারফরম্যান্স প্রভাবও রয়েছে। আপনি সহজেই সি বা সি ++ মডিউলগুলিতে লিঙ্ক করতে পারেন বা সেগুলি সন্ধান করতে পারেন তবে আপনি যদি সরাসরি পাইথন রান করেন তবে এটির পারফরম্যান্স হিট হবে।

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

এখানে আমি মাঝে মাঝে উল্লেখ করি এমন একটি মজাদার মানদণ্ডের পরীক্ষার সেট:

http://www.techempower.com/benchmarks/

(যা যা বলেছিল, আমি পাইথনকে এখনও খুব ভালবাসি এবং আমি যে ভাষায় কাজ করছি তা চয়ন করার সুযোগ পেলে এটি আমার প্রথম পছন্দ Most বেশিরভাগ ক্ষেত্রে, আমি যাইহোক পাগল থ্রুটপুট প্রয়োজনীয়তায় আবদ্ধ হই না))


2
স্ট্রিং "এ" প্রথম বুলেট পয়েন্টের জন্য ভাল উদাহরণ নয়। একটি জাভা স্ট্রিংয়ের একক চরিত্রের স্ট্রিংগুলির জন্য যথেষ্ট পরিমাণে ওভারহেড রয়েছে, এবং এটি ধ্রুবক ওভারহেড যা স্ট্রিংটির দৈর্ঘ্য বাড়ার সাথে সাথে আকারটি দীর্ঘায়িত হয় (সংস্করণ, বিল্ড অপশন এবং স্ট্রিংয়ের বিষয়বস্তুর উপর নির্ভর করে এক থেকে চার বাইট ওরে অক্ষর)। আপনি যদিও ব্যবহারকারী-সংজ্ঞায়িত অবজেক্ট সম্পর্কে সঠিক, কমপক্ষে যা ব্যবহার করেন না __slots__। পিপাইয়ের এই ক্ষেত্রে আরও ভাল করা উচিত তবে আমি বিচার করার পক্ষে যথেষ্ট জানি না।

1
আপনি যে দ্বিতীয় সমস্যাটির প্রতি ইঙ্গিত দিচ্ছেন তা কেবলমাত্র নির্দিষ্ট প্রয়োগের সাথে সম্পর্কিত এবং ভাষার অন্তর্নিহিত নয়। প্রথম সমস্যার ব্যাখ্যার প্রয়োজন: 28 বাইটের "ওজন" কী তা নিজেই চরিত্রটি নয় বরং এটি একটি স্ট্রিং ক্লাসে প্যাক করা হয়েছে, এটি তার নিজস্ব পদ্ধতি এবং বৈশিষ্ট্য নিয়ে আসে। বাইট অ্যারে হিসাবে একক অক্ষরকে উপস্থাপন করে (আক্ষরিক বি'এ ') পাইথন ৩.৩ এ "কেবল" ওজনের 18 বাইট ওজন এবং আমি নিশ্চিত যে আপনার অ্যাপ্লিকেশনটির সত্যই এটি প্রয়োজন হলে মেমরির মধ্যে অক্ষর সংগ্রহের অনুকূলিতকরণের আরও অনেক উপায় রয়েছে।
লাল

সি # স্থানীয়ভাবে সংকলন করতে পারে (যেমন আসন্ন এমএস টেক, আইওএসের জন্য জামারিন)।
ডেন

13

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

  • স্বল্প-চলমান স্ক্রিপ্টগুলি, যেমন সিসাদমিন কার্যগুলির জন্য ব্যবহৃত। উবুন্টুর মতো অনেক অপারেটিং সিস্টেমগুলি পাইথনের শীর্ষে তাদের অবকাঠামোর একটি ভাল অংশ তৈরি করে: সিপিথন কাজের জন্য যথেষ্ট দ্রুত, তবে কার্যত কোনও প্রারম্ভকালীন সময় নেই। যতক্ষণ এটি বাশের চেয়ে দ্রুত, এটি ভাল।

  • সিপিথনে অবশ্যই স্পষ্ট শব্দার্থক শব্দ থাকতে হবে, কারণ এটি একটি রেফারেন্স বাস্তবায়ন। এটি "ফু অপারেটরের বাস্তবায়ন অনুকূলকরণ" বা "দ্রুত বাইটোকোডে তালিকা বোধগম্য সংকলন" এর মতো সাধারণ অপ্টিমাইজেশনের অনুমতি দেয় তবে সাধারণত ইনলাইনিং ফাংশনগুলির মতো তথ্য ধ্বংসকারী অপ্টিমাইজেশানগুলিকে বাদ দেয়।

অবশ্যই সিপিথনের চেয়ে পাইথন বাস্তবায়ন রয়েছে:

  • জেথনটি জেভিএমের শীর্ষে নির্মিত। জেভিএম প্রদত্ত বাইটকোডকে ব্যাখ্যা বা জাইটি সংকলন করতে পারে এবং এতে প্রোফাইল-গাইডড অপ্টিমাইজেশন রয়েছে। এটি উচ্চ শুরুর সময় সহ্য করে, এবং জেআইটি প্রবেশের সময় পর্যন্ত এটি কিছুটা সময় নেয়।

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

  • সিথন হ'ল (RPython এর মত) স্ট্যাটিক টাইপিংয়ের সাথে বেমানান পাইথন উপভাষা। এটি সি কোডেও স্থানান্তর করে এবং সিপিথন ইন্টারপ্রেটারের জন্য সি এক্সটেনশনগুলি সহজেই তৈরি করতে সক্ষম।

যদি আপনি আপনার পাইথন কোডটি সিথন বা আরপিথনে অনুবাদ করতে চান তবে আপনি সি-এর মতো পারফরম্যান্স পাবেন। তবে এগুলি "পাইথনের একটি উপসেট" হিসাবে বোঝা উচিত নয়, বরং এটি "পাইথোনিক সিনট্যাক্স সহ সি" হিসাবে হওয়া উচিত। আপনি যদি পাইপাইতে স্যুইচ করেন, আপনার ভ্যানিলা পাইথন কোডটি যথেষ্ট গতি বাড়িয়ে তুলবে, তবে সি বা সি ++ তে লিখিত এক্সটেনশনগুলির সাথে ইন্টারফেস করতে অক্ষম হবে।

তবে কোন বৈশিষ্ট্য বা বৈশিষ্ট্যগুলি ভ্যানিলা পাইথনকে সি-এর মতো কর্মক্ষমতা পর্যায়ে পৌঁছাতে বাধা দেয়, প্রারম্ভকালীন সময়গুলি বাদ দিয়ে?

  • অবদানকারী এবং তহবিল। জাভা বা সি # এর বিপরীতে, এই ভাষাটিকে তার শ্রেণীর সেরা করার আগ্রহের সাথে ভাষার পিছনে কোনও একক ড্রাইভিং সংস্থা নেই। এটি বিকাশকে প্রধানত স্বেচ্ছাসেবীদের এবং মাঝে মাঝে অনুদানের মধ্যে সীমাবদ্ধ করে।

  • দেরীতে বাইন্ডিং এবং কোনও স্থির টাইপিংয়ের অভাব। পাইথন আমাদের এইভাবে বকাবকি লেখার অনুমতি দেয়:

    import random
    
    # foo is a function that returns an empty list
    def foo(): return []
    
    # foo is a function, right?
    # this ought to be equivalent to "bar = foo"
    def bar(): return foo()
    
    # ooh, we can reassign variables to a different type – randomly
    if random.randint(0, 1):
       foo = 42
    
    print bar()
    # why does this blow up (in 50% of cases)?
    # "foo" was a function while "bar" was defined!
    # ah, the joys of late binding

    পাইথনে, যে কোনও পরিবর্তনশীল যে কোনও সময় পুনরায় নিয়োগ দেওয়া যেতে পারে। এটি ক্যাচিং বা ইনলাইনিং প্রতিরোধ করে; কোনও অ্যাক্সেস ভেরিয়েবল মাধ্যমে যেতে হয়। এই নির্দেশনা কার্যক্ষমতা হ্রাস। অবশ্যই: যদি আপনার কোডটি এমন উন্মাদ কাজ না করে যাতে প্রতিটি পরিবর্তনকে সংকলনের আগে একটি নির্দিষ্ট ধরণের দেওয়া যেতে পারে এবং প্রতিটি ভেরিয়েবল কেবল একবার বরাদ্দ করা হয়, তাত্ত্বিকভাবে - আরও কার্যকর এক্সিকিউশন মডেল বেছে নেওয়া যেতে পারে। এটিকে মাথায় রেখে একটি ভাষা সনাক্তকারীদের ধ্রুবক হিসাবে চিহ্নিত করার কিছু উপায় সরবরাহ করবে এবং কমপক্ষে alচ্ছিক প্রকারের টীকাগুলি ("ধীরে ধীরে টাইপিং") মঞ্জুর করবে।

  • একটি প্রশ্নবিদ্ধ অবজেক্ট মডেল। স্লট ব্যবহার না করা অবধি কোন বস্তুর কোন ক্ষেত্র রয়েছে তা নির্ধারণ করা শক্ত (পাইথন অবজেক্টটি মূলত ক্ষেত্রগুলির একটি হ্যাশ টেবিল)। এমনকি একবার আমরা সেখানে উপস্থিত হয়ে গেলেও এই ক্ষেত্রগুলি কী ধরণের তা আমাদের এখনও ধারণা নেই। এটি সি ++ এর ক্ষেত্রে যেমন শক্তভাবে প্যাক করা স্ট্রাক্ট হিসাবে অবজেক্টগুলিকে প্রতিনিধিত্ব করতে বাধা দেয়। (অবশ্যই, সি ++ এর অবজেক্টগুলির প্রতিনিধিত্ব আদর্শ নয়: কাঠামোর মতো প্রকৃতির কারণে, এমনকি ব্যক্তিগত ক্ষেত্রগুলি কোনও সামগ্রীর পাবলিক ইন্টারফেসের অন্তর্ভুক্ত))

  • আবর্জনা সংগ্রহ. অনেক ক্ষেত্রে, জিসি সম্পূর্ণরূপে এড়ানো যেতে পারে। সি ++ আমাদের স্ট্যাটিক্যালি বস্তু যা স্বয়ংক্রিয়ভাবে ধ্বংস করে দেওয়া হয় যখন বর্তমান সুযোগ ছেড়ে দেওয়া হয় বরাদ্দ করা অনুমতি দেয়: Type instance(args);। ততক্ষণ পর্যন্ত অবজেক্টটি জীবিত এবং অন্যান্য ফাংশনে ntণ দেওয়া যেতে পারে। এটি সাধারণত "পাস-বাই-রেফারেন্স" এর মাধ্যমে করা হয়। মরিচের মতো ভাষা সংকলককে স্থিরভাবে পরীক্ষা করতে দেয় যে এই জাতীয় কোনও বস্তুর কোনও পয়েন্টার বস্তুর আজীবন ছাড়িয়ে যায় না। এই মেমরি পরিচালনা প্রকল্পটি সম্পূর্ণ অনুমানযোগ্য, অত্যন্ত দক্ষ এবং জটিল অবজেক্টের গ্রাফ ছাড়াই বেশিরভাগ ক্ষেত্রে স্যুট করে। দুর্ভাগ্যক্রমে, পাইথন মেমরি পরিচালনার কথা মাথায় রেখে তৈরি করা হয়নি। তত্ত্বের ক্ষেত্রে, এসিসি বিশ্লেষণগুলি এমন কেসগুলি সন্ধান করতে ব্যবহার করা যেতে পারে যেখানে জিসি এড়ানো যায়। অনুশীলনে, সহজ পদ্ধতির চেইন যেমনfoo().bar().baz() স্তূপে প্রচুর সংখ্যক স্বল্প-স্থায়ী বস্তু বরাদ্দ করতে হবে (এই সমস্যাটি ছোট রাখার জন্য এক প্রজন্মের জিসি)।

    অন্যান্য ক্ষেত্রে, প্রোগ্রামার ইতিমধ্যে কিছু বস্তুর যেমন চূড়ান্ত আকারের তালিকা জানতে পারে। দুর্ভাগ্যক্রমে, পাইথন একটি নতুন তালিকা তৈরি করার সময় এটি যোগাযোগের কোনও উপায় সরবরাহ করে না। পরিবর্তে, নতুন আইটেমগুলি শেষের দিকে ধাক্কা দেওয়া হবে, যার জন্য একাধিক পুনঃনির্ধারণের প্রয়োজন হতে পারে। কয়েকটি নোট:

    • নির্দিষ্ট আকারের তালিকাগুলির মতো তৈরি করা যায় fixed_size = [None] * size। তবে, সেই তালিকার অভ্যন্তরগুলির জন্য মেমরিটি আলাদাভাবে বরাদ্দ করতে হবে। বৈসাদৃশ্য সি ++, যেখানে আমরা করতে পারি std::array<Type, size> fixed_size

    • arrayবিল্টিন মডিউলটির মাধ্যমে পাইথনে একটি নির্দিষ্ট নেটিভ টাইপের প্যাকযুক্ত অ্যারে তৈরি করা যেতে পারে । এছাড়াও, numpyস্থানীয় সংখ্যার জন্য নির্দিষ্ট আকারের সাথে ডেটা বাফারের দক্ষ উপস্থাপনা সরবরাহ করা হয়।

সারসংক্ষেপ

পাইথন ব্যবহারের সুবিধার্থে নয়, ব্যবহারের সুবিধার্থে ডিজাইন করা হয়েছিল। এর নকশা অত্যন্ত দক্ষ বাস্তবায়ন তৈরি করা বরং কঠিন করে তোলে। প্রোগ্রামার যদি সমস্যাযুক্ত বৈশিষ্ট্যগুলি থেকে বিরত থাকে, তবে বাকী আইডিয়ামগুলি বোঝার একটি সংকলক দক্ষ কোড নির্গত করতে সক্ষম হবে যা কার্য সম্পাদনে সি প্রতিদ্বন্দ্বী করতে পারে।


8

হ্যাঁ. প্রাথমিক সমস্যাটি হ'ল ভাষাটিকে গতিশীল হিসাবে সংজ্ঞায়িত করা হয় - এটি হ'ল আপনি কখনই জানেন না আপনি যতক্ষণ না এটি করছেন। এটা খুব কঠিন কারণ আপনার কি মেশিন কোড উত্পাদন করতে জানি না, দক্ষ মেশিন কোড উৎপন্ন করে তোলে জন্য । জেআইটি সংকলকরা এই ক্ষেত্রে কিছু কাজ করতে পারে তবে এটি সি ++ এর সাথে কখনই তুলনামূলক নয় কারণ জেআইটি সংকলক কেবল সময় এবং মেমরি চলতে ব্যয় করতে পারে না, যেহেতু সময় এবং স্মৃতি আপনি আপনার প্রোগ্রামটি চালাতে ব্যয় করছেন না, এবং এর কঠোর সীমাবদ্ধতা রয়েছে তারা গতিশীল ভাষার শব্দার্থবিজ্ঞান ভঙ্গ না করে অর্জন করতে পারে।

আমি দাবি করতে যাচ্ছি না যে এটি একটি অগ্রহণযোগ্য ট্রেড অফ। তবে পাইথনের প্রকৃতির পক্ষে এটি মৌলিক যে বাস্তব বাস্তবায়ন কখনই সি ++ বাস্তবায়নের মতো তত দ্রুত হয় না।


8

তিনটি প্রধান কারণ রয়েছে যা সমস্ত গতিশীল ভাষার কার্য সম্পাদনকে প্রভাবিত করে, অন্যদের তুলনায় আরও কিছু।

  1. ইন্টারপ্রেটিভ ওভারহেড রানটাইমের সময় মেশিনের নির্দেশাবলীর চেয়ে কিছুটা বাইট কোড থাকে এবং এই কোডটি কার্যকর করার জন্য একটি নির্দিষ্ট ওভারহেড থাকে।
  2. ওভারহেড প্রেরণ রানটাইম অবধি কোনও ফাংশন কলের লক্ষ্য জানা যায়নি এবং কোন পদ্ধতিতে কল করতে কোনও খরচ বহন করে তা সন্ধান করে।
  3. মেমরি পরিচালনা ওভারহেড। গতিশীল ভাষাগুলি এমন বস্তুগুলিতে স্টাফ সঞ্চয় করে যা বরাদ্দ করতে হবে এবং নির্বিঘ্ন করতে হবে এবং এটির উপরের পারফরম্যান্স বহন করে।

সি / সি ++ এর জন্য এই 3 টি কারণের আপেক্ষিক ব্যয় প্রায় শূন্য। প্রসেসরের মাধ্যমে নির্দেশাবলী সরাসরি সম্পাদন করা হয়, প্রেরণটি প্রায় দুই বা দুটি দিকনির্দেশ নেয়, আপনি না বললে হিপ মেমরি কখনই বরাদ্দ করা হয় না। সু-লিখিত কোডটি সমাবেশের ভাষায় আসতে পারে।

সিআই / জাভাতে জেআইটি সংকলন সহ প্রথম দুটি কম তবে আবর্জনা সংগ্রহ করা মেমোরির একটি ব্যয় হয়। ভাল লিখিত কোড 2x সি / সি ++ এ যেতে পারে।

পাইথন / রুবি / পার্লের জন্য এই তিনটি কারণেরই দাম তুলনামূলকভাবে বেশি। সি / সি ++ বা আরও খারাপের তুলনায় 5x ভাবেন। (*)

মনে রাখবেন রানটাইম লাইব্রেরি কোডটি আপনার প্রোগ্রামগুলির মতো একই ভাষায় লেখা যেতে পারে এবং একই কর্মক্ষমতা সীমাবদ্ধতা থাকতে পারে।


(*) এই ভাষাগুলিতে জাস্ট-ইন_টাইম (জেআইটি) সংকলন প্রসারিত হওয়ার সাথে সাথে তারাও ভালভাবে লেখা সি / সি ++ কোডের গতিতে (সাধারণত 2x) যোগাযোগ করবে।

এটিও লক্ষ করা উচিত যে একবার ফাঁক সংকীর্ণ হয়ে গেলে (প্রতিদ্বন্দ্বী ভাষাগুলির মধ্যে), তারপরে পার্থক্যগুলি অ্যালগোরিদম এবং প্রয়োগের বিশদ দ্বারা প্রভাবিত হয়। জেআইটি কোড সি / সি ++ কে এবং সি / সি ++ বিধানসভা ভাষাকে মারতে পারে কারণ ভাল কোড লেখা সহজ।


"মনে রাখবেন রানটাইম লাইব্রেরি কোডটি আপনার প্রোগ্রামগুলির মতো একই ভাষায় লেখা যেতে পারে এবং একই কর্মক্ষমতা সীমাবদ্ধতা থাকতে পারে।" এবং "পাইথন / রুবি / পার্লের জন্য এই তিনটি কারণের দাম তুলনামূলকভাবে বেশি C সি / সি ++ বা এর চেয়ে খারাপ এর তুলনায় 5x ভাবেন।" আসলে, এটা সত্য নয়। উদাহরণস্বরূপ, রুবিনিয়াস Hashক্লাস (রুবিতে মূল ডেটাস্ট্রাকচারগুলির মধ্যে একটি) রুবিতে লেখা হয়, এবং এটি তুলনামূলকভাবে সঞ্চালিত হয়, কখনও কখনও আরও দ্রুত, সিএর মধ্যে লেখা YARV এর Hashক্লাসের তুলনায় এবং এর একটি কারণ হ'ল রুবিনিয়াসের রানটাইমের বড় অংশগুলি সিস্টেমটি রুবিতে লেখা আছে, যাতে তারা…
জার্গ ডব্লু মিতাগ

… উদাহরণস্বরূপ রুবিনিয়াস সংকলক দ্বারা অন্তর্ভুক্ত করা উচিত। চূড়ান্ত উদাহরণগুলি হ'ল ক্লেইন ভিএম (স্বের জন্য একটি মেটাসার্কুলার ভিএম) এবং ম্যাক্সাইন ভিএম (জাভার জন্য একটি মেটাসার্কুলার ভিএম), যেখানে সবকিছু , এমনকি পদ্ধতি প্রেরণ কোড, আবর্জনা সংগ্রহকারী, মেমরি বরাদ্দকারী, আদিম ধরণের, কোর ডেটাস্ট্রাকচার এবং অ্যালগরিদমে লিখিত রয়েছে স্ব বা জাভা। এইভাবে, এমনকি মূল ভিএম এর কিছু অংশগুলি ইউজারকোডের সাথে অন্তর্ভুক্ত করা যেতে পারে এবং ভিএম ব্যবহারকারী প্রোগ্রাম থেকে রানটাইম প্রতিক্রিয়া ব্যবহার করে পুনরায় সংকলন এবং পুনরায় অনুকূল করতে পারে।
জার্গ ডব্লু মিট্টাগ

@ জার্গডব্লিউমিত্যাগ: এখনও সত্য। রুবিনিয়াসে জেআইটি রয়েছে, এবং জেআইটি কোড প্রায়শই স্বতন্ত্র মাপদণ্ডে সি / সি ++ মারধর করে। জেআইটির অনুপস্থিতিতে এই মেটাাসাইকুলার স্টাফ গতির জন্য অনেক কিছু করে এমন কোনও প্রমাণ আমি পাই না। [জেআইটি সম্পর্কে স্বচ্ছতার জন্য সম্পাদনা দেখুন]]
ডেভিড.পিএফএক্স

1

কিন্তু এমন কি প্রযুক্তিগত সীমাবদ্ধতা বা ভাষার বৈশিষ্ট্য রয়েছে যা আমার পাইথন স্ক্রিপ্টকে সমতুল্য সি ++ প্রোগ্রামের মতো দ্রুত হতে বাধা দেয়?

না। এটি কেবল অর্থ ও সংস্থানগুলির প্রশ্ন যা সি ++ রান দ্রুত বনাম টাকা এবং সংস্থানগুলিকে পাইথনকে দ্রুত রান করার জন্য pouredেলে দেওয়া হয়েছে।

উদাহরণস্বরূপ, যখন সেলফ ভিএম বেরিয়ে এসেছিল, এটি কেবলমাত্র দ্রুত গতিশীল ওও ভাষা নয়, এটি ছিল ওও ভাষার দ্রুততম সময়কাল। অবিশ্বাস্যরূপে গতিশীল ভাষা হওয়া সত্ত্বেও (উদাহরণস্বরূপ পাইথন, রুবি, পিএইচপি বা জাভাস্ক্রিপ্টের তুলনায় অনেক বেশি), এটি উপলব্ধ বেশিরভাগ সি ++ বাস্তবায়নগুলির চেয়ে দ্রুত ছিল।

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

আমি পাইথনের সাথে ভয়াবহভাবে পরিচিত নই, আমি আরও রুবি ব্যাক্তি, তাই আমি রুবীর কাছ থেকে একটি উদাহরণ দেব: রুবিনিয়াস রুবির প্রয়োগে Hashক্লাস ( dictপাইথনের সাথে ফাংশন এবং গুরুত্বের সমতুল্য ) 100% খাঁটি রুবিতে লেখা; তবুও এটি অনুকূলভাবে প্রতিদ্বন্দ্বিতা করে এবং কখনও কখনও এমনকি HashYARV তে যে ক্লাসটি হ্যান্ড-অপ্টিমাইজড সিতে লেখা হয় এবং দক্ষ কিছু লিস্প বা স্মলটালক সিস্টেমের (বা পূর্বে উল্লিখিত সেলফ ভিএম) তুলনায়, রুবিনিয়াসের সংকলকটি তেমন চালাকও নয় ।

পাইথনে অন্তর্নিহিত এমন কিছু নেই যা এটিকে ধীর করে দেয়। আজকের প্রসেসর এবং অপারেটিং সিস্টেমগুলিতে এমন বৈশিষ্ট্য রয়েছে যা পাইথনকে আঘাত করে (যেমন ভার্চুয়াল মেমরিটি আবর্জনা সংগ্রহের পারফরম্যান্সের জন্য ভয়ানক হিসাবে পরিচিত)। এমন বৈশিষ্ট্য রয়েছে যা সি ++ তে সহায়তা করে তবে পাইথনকে সহায়তা করে না (আধুনিক সিপিইউগুলি ক্যাশে মিস করা এড়াতে চেষ্টা করে, কারণ এগুলি ব্যয়বহুল Unfortunately মিস করে না Java

যদি আপনি পাইথনকে দ্রুত তৈরি করতে যতটা অর্থ, গবেষণা এবং সংস্থান হিসাবে সি ++ এর জন্য করা হয় এবং আপনি যে অপারেটিং সিস্টেমগুলি পাইথন প্রোগ্রামগুলিকে দ্রুত চালিত করে তোলে সেগুলি তৈরি করতে তত অর্থ, গবেষণা এবং সংস্থান ব্যয় করে যা আপনি সি ++ এর মতো করে ব্যয় করেছিলেন এবং আপনি যেমন ব্যয় করেছেন পাইথন প্রোগ্রামগুলিকে সি -++ এর মতো দ্রুত চালিত করে তোলে এমন সিপিইউ তৈরির উপর প্রচুর অর্থ, গবেষণা এবং সংস্থান, তবে আমার মনে সন্দেহ নেই যে পাইথন সি ++ এর তুলনায় পারফরম্যান্সে পৌঁছে যেতে পারে।

আমরা কেবলমাত্র একজন খেলোয়াড় পারফরম্যান্স নিয়ে সিরিয়াস হয়ে গেলে কী ঘটতে পারে তা আমরা ইসএমএএসক্রিপ্টের সাথে দেখেছি। এক বছরের মধ্যে, সমস্ত বড় বিক্রেতাদের জন্য আমরা বোর্ড জুড়ে মূলত 10x পারফরম্যান্স বৃদ্ধি পেয়েছিলাম।

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