পাইথন কোডটি সংকলন কেন?


241

আপনি কেন পাইথন স্ক্রিপ্ট সংকলন করবেন? আপনি এগুলিকে .py ফাইল থেকে সরাসরি চালাতে পারেন এবং এটি দুর্দান্ত কাজ করে, তাই কোনও পারফরম্যান্স সুবিধা বা কিছু আছে?

আমি আরও লক্ষ্য করেছি যে আমার অ্যাপ্লিকেশনটির কিছু ফাইল .pyc তে সংকলিত হয়েছে অন্যরা না করে, কেন এটি?


আপনি আরও লক্ষ করতে পারেন যে, আপনার অ্যাপ্লিকেশনটির দ্রুত প্রারম্ভ সহ আপনি সুরক্ষায়ও লাভ করতে পারেন, যদি আপনি নিজের কোডটি কর্পোরেট গোপনে ভাগ না করতে পারেন।
করে_ডন্ট_বুলি_মে_স_এলর্ডস

@ পিএসলোক আপনি কি সত্যিই, সত্যিই না। পাইথন বাইটকোডটি সত্যিই পঠনযোগ্য, কারণ সংযোজকটিকে এটির অনুকূলিতকরণের জন্য এটি বিচলিত করার প্রয়োজন নেই। (এমন নয় যে এটি এটিকে আরও অনুকূল করে দেয় ...)
wizzwizz4

1
কিছু ফাইল স্বয়ংক্রিয়ভাবে সংকলিত হওয়ার কারণ হ'ল এগুলি আমদানি করা হয়; উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন তবে import mylib.pyপাইথন সংকলন করবে mylib.pyযাতে ভবিষ্যতের importবিবৃতিগুলি আরও দ্রুত চালিত হয়। আপনি যদি পরে পরিবর্তন করেন mylib.pyতবে এটি পরবর্তী সময় আমদানি হওয়ার পরে এটি পুনরায় সংকলন করবে (পাইথন এটি ঘটেছে তা দেখার জন্য ফাইলের তারিখটি ব্যবহার করে))
fyngyrz

উত্তর:


270

এটি বাইটকোডে সংকলিত হয়েছে যা অনেক বেশি, অনেক বেশি দ্রুত ব্যবহার করা যেতে পারে।

কিছু ফাইল সংকলিত না হওয়ার কারণ হ'ল মূল স্ক্রিপ্ট, আপনি যে python main.pyবারের সাথে অনুরোধ করেছেন প্রতিবার স্ক্রিপ্টটি চালানোর সময় তা পুনরায় কম্পাইল করা হয়। সমস্ত আমদানিকৃত স্ক্রিপ্টগুলি ডিস্কে সংকলন এবং সংরক্ষণ করা হবে।

বেন ব্ল্যাঙ্কের গুরুত্বপূর্ণ সংযোজন :

এটি লক্ষ্য করার মতো যে একটি সংকলিত স্ক্রিপ্টটি চালানোর সময় দ্রুত প্রারম্ভকালীন সময় হয় (কারণ এটি সংকলনের প্রয়োজন হয় না), এটি কোনও দ্রুত চালায় না ।


260
এটি লক্ষ্য করার মতো যে একটি সংকলিত স্ক্রিপ্ট চালানোর সময় দ্রুত প্রারম্ভকালীন সময় হয় (কারণ এটি সংকলনের প্রয়োজন হয় না), এটি কোনও দ্রুত চালায় না ।
বেন ফাঁকা

24
একটি সাধারণ ভুল ধারণা। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
ম্যাটপি

1
সংকলনের প্রয়োজন না পড়ার সাথে সাথে .pyc ফাইলটি প্রায় অল্পই ছোট। বিশেষ করে আপনি যদি অনেক মন্তব্য। আমার একটি .py হিসাবে 28419, তবে .pyc হিসাবে কেবল 17879 - সুতরাং লোড সময়টিও ভাল। শেষ অবধি, আপনি শীর্ষ স্তরের স্ক্রিপ্টগুলি এইভাবে প্রাক
কম্পাইল

1
স্মৃতি সেবনে কি কোনও পার্থক্য আছে? আমি এমপি এমপিউ ভিত্তিক এমবেডেড ডিভাইসগুলিতে পাইথনটি কেবলমাত্র 64৪ এমবি র‌্যামের সাথে পরীক্ষা করছি, তাই পাইথন স্ক্রিপ্টের সংকলিত সংস্করণ শুরু করার সময় মেমরি ব্যবহারে কোনও সুবিধা আছে কি?
ভ্যালেন্ট

1
@ ভ্যালেন্ট: সম্ভবত না। পাইথন ইন্টারনাল সম্পর্কে আমি খুব বেশি কিছু জানি না, তবে আমি মনে করি না বাইথকোডে পার্স করা পাইথনে অনেক স্মৃতি নিয়ে যায়। আমি এমন কিছু বিষয় ভাবতে পারি না যার কিছু অবস্থা স্মরণে রাখার জন্য প্রচুর স্মৃতি দরকার।
জর্জি স্কলি

80

.Pyc ফাইলটি পাইথন যা ইতিমধ্যে বাইট-কোডে সংকলিত হয়েছে। পাইথন স্বয়ংক্রিয়ভাবে একটি। পিসি ফাইল চালায় যদি এটি আপনাকে অনুরোধ করে এমন একটি .py ফাইল হিসাবে একই নামের একটি খুঁজে পায়।

পাইথন ফাইলগুলির সংকলন সম্পর্কে "পাইথনের পরিচিতি" বলছে :

যখন একটি '.pyc' বা '.pyo' ফাইল থেকে পড়া হয় তখন কোনও প্রোগ্রামটি কোনও '.py' ফাইল থেকে পড়ার পরে তত দ্রুত সঞ্চালিত হয় না; '.pyc' বা '.pyo' ফাইলগুলির সম্পর্কে দ্রুত যা কেবল সেগুলিই লোড হয় speed

একটি .pyc ফাইল চালানোর সুবিধাটি হ'ল পাইথনটি চালানোর আগে এটি সংকলনের ওভারহেড ব্যয় করতে হয় না। যেহেতু পাইথন কোনওভাবেই .py ফাইল চালানোর আগে বাইট-কোডে সংকলন করবে, সুতরাং এর বাইরে কোনও কার্যকারিতা উন্নতি হওয়া উচিত নয়।

সংকলিত .pyc ফাইল ব্যবহার করে আপনি কতটা উন্নতি পেতে পারেন? এটি স্ক্রিপ্ট কী করে তার উপর নির্ভর করে। খুব সংক্ষিপ্ত স্ক্রিপ্টের জন্য যা কেবল "হ্যালো ওয়ার্ল্ড" মুদ্রণ করে মোট সংকলন-চালিত সময়ের একটি বড় শতাংশ গঠন করতে পারে। তবে দীর্ঘ রান চলমান স্ক্রিপ্টগুলির জন্য মোট রান সময়ের তুলনায় স্ক্রিপ্ট সংকলনের ব্যয় হ্রাস পাচ্ছে।

কমান্ড-লাইনে আপনি যে স্ক্রিপ্টটির নাম দিচ্ছেন তা কখনও কোনও .pyc ফাইলে সংরক্ষণ করা হয় না। কেবলমাত্র "মূল" স্ক্রিপ্ট দ্বারা লোড হওয়া মডিউলগুলি সেভাবেই সংরক্ষণ করা হয়।


3
অনেক ক্ষেত্রেই এটির পার্থক্য দেখা শক্ত, তবে আমার কাছে 300,000 এর বেশি লাইন বিশিষ্ট একটি অজগর ফাইল রয়েছে। (এটি পরীক্ষার জন্য অন্য স্ক্রিপ্ট দ্বারা উত্পন্ন গণিত গণনার একগুচ্ছ) সংকলন করতে এটি 37 সেকেন্ড, এবং কার্যকর করতে 2 সেকেন্ড সময় নেয়।
ওয়াজটাউ

54

pluses:

প্রথম: হালকা, পরাজিতযোগ্য অবসন্নতা।

দ্বিতীয়: সংকলনটি যদি একটি উল্লেখযোগ্যভাবে ছোট ফাইলের ফলাফল দেয় তবে আপনি দ্রুত লোড বার পাবেন। ওয়েবের জন্য দুর্দান্ত।

তৃতীয়: পাইথন সংকলনের পদক্ষেপটি এড়িয়ে যেতে পারে। অন্তর্নিহিত লোডে আরও দ্রুত। সিপিইউ এবং ওয়েবের জন্য দুর্দান্ত।

চতুর্থ: আপনি যত বেশি মন্তব্য করবেন, উত্স ফাইলের তুলনায় তুলনামূলকভাবে কম .pycবা .pyoফাইলটি হবে .py

পঞ্চম: কেবলমাত্র একটি ফাইল .pycবা .pyoহাতে ফাইল হাতে থাকা কোনও ব্যবহারকারী আপনাকে কোনও বাগ-পাল্টানো পরিবর্তনের কারণে যে বাগটি বলেছিল তা আপনাকে জানাতে ভুলে গেছে এমন একটি বাগের সাথে আপনি উপস্থিত হতে পারে to

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

শীর্ষ স্তরের সংকলন

এটি আপনি একটি শীর্ষ স্তরের পাইথন উত্স ফাইলটি একটি .pycফাইলের মধ্যে এইভাবে সংকলন করতে পারেন তা জেনে রাখা কার্যকর :

python -m py_compile myscript.py

এটি মন্তব্যগুলি সরিয়ে দেয়। এটি docstringsঅক্ষত থাকে। আপনি যদি এ docstringsথেকেও মুক্তি পেতে চান (আপনি কেন করছেন তা নিয়ে আপনি গুরুত্ব সহকারে ভাবতে চাইতে পারেন) তবে পরিবর্তে এইভাবে সংকলন করুন ...

python -OO -m py_compile myscript.py

... এবং আপনি একটি .pyoফাইলের পরিবর্তে একটি .pycফাইল পাবেন; কোডটির প্রয়োজনীয় কার্যকারিতার দিক থেকে সমানভাবে বিতরণযোগ্য, তবে স্ট্রিপ আউট-এর আকার অনুসারে ছোট docstrings(এবং পরবর্তী কর্মসংস্থানের জন্য এটি যদি docstringsপ্রথম স্থানে শালীন থাকে তবে সহজেই সহজে বোঝা যায় )। তবে ত্রুটিটি তিনটি, নীচে দেখুন।

দ্রষ্টব্য যে পাইথন .pyফাইলের তারিখ ব্যবহার করে , যদি তা উপস্থিত থাকে তবে সিদ্ধান্ত নিতে যে এটি .pyফাইলটি .pycবা .pyoফাইলের বিপরীতে চালানো উচিত --- সুতরাং আপনার .py ফাইলটি সম্পাদনা করুন এবং .pycবা .pyoঅপ্রচলিত এবং আপনার যে কোনও উপকারিতা হারিয়ে গেছে তা নষ্ট হয়ে গেছে। আবার .pycবা .pyoসুবিধাগুলি পুনরায় ফিরে পেতে আপনার এটিকে পুনরায় সংকলন করতে হবে যেমন যেমন তারা।

অপূর্ণতা:

প্রথম: একটি "ম্যাজিক কুকি" আছে .pycএবং .pyoফাইলগুলি সিস্টেম আর্কিটেকচারকে ইঙ্গিত করে যে পাইথন ফাইলটি সংকলিত হয়েছিল you আপনি যদি এই ফাইলগুলির মধ্যে একটি অন্যরকম পরিবেশে বিতরণ করেন তবে এটি ভেঙে যাবে। আপনি বিতরণ তাহলে .pycবা .pyoযুক্ত থাকলে .pyপুনরায় কম্পাইল করতে বা touchতাই এটি supersedes .pycবা .pyo, শেষ ব্যবহারকারী এটা ঠিক করতে পারে না, পারেন।

দ্বিতীয়: যদি উপরে বর্ণিত কমান্ড লাইন বিকল্পটি docstringsব্যবহার -OOনা করা হয় তবে কেউ সেই তথ্যটি পেতে সক্ষম হবেনা, যা কোডটি ব্যবহারকে আরও কঠিন (বা অসম্ভব) করতে পারে)

তৃতীয়: পাইথনের -OOবিকল্পটি -Oকমান্ড লাইন বিকল্প অনুযায়ী কিছু অপ্টিমাইজেশন প্রয়োগ করে ; এটি অপারেশন পরিবর্তন হতে পারে। পরিচিত অপ্টিমাইজেশনগুলি হ'ল:

  • sys.flags.optimize = 1
  • assert বিবৃতি এড়ানো হয়
  • __debug__ = মিথ্যা

চতুর্থ: আপনি ইচ্ছাকৃতভাবে ক্রম কিছু সঙ্গে আপনার পাইথন স্ক্রিপ্ট এক্সিকিউটেবল করেছিল #!/usr/bin/pythonপ্রথম লাইন, এই আউট ছিনতাই হয় .pycএবং .pyoফাইল ও যে কার্যকারিতা হারিয়ে গেছে।

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


10

সংকলিত পাইথন চালানোর কার্যক্ষমতা বৃদ্ধি পাচ্ছে increase তবে আপনি যখন একটি এমপি ফাইলটি আমদানি করা মডিউল হিসাবে চালাবেন, অজগর এটি সংকলন এবং সঞ্চয় করবে এবং যতক্ষণ না .py ফাইলটি পরিবর্তন না করে এটি সর্বদা সংকলিত সংস্করণ ব্যবহার করবে।

যে কোনও ইন্টারপেটেড ভাষার সাথে ফাইলটি ব্যবহার করা হলে প্রক্রিয়াটি এরকম কিছু দেখাচ্ছে:
১. ফাইলটি ইন্টারপিটার দ্বারা প্রক্রিয়া করা হয়।
২. ফাইলটি সংকলিত
3.. সংযুক্ত কোডটি কার্যকর করা হয়।

স্পষ্টতই প্রাক-সংকলিত কোড ব্যবহার করে আপনি ধাপ 2 কে সরিয়ে দিতে পারেন, এটি অজগর, পিএইচপি এবং অন্যান্য প্রয়োগ করে।

তিনি এখানে একটি আকর্ষণীয় ব্লগ পোস্ট পার্থক্য ব্যাখ্যা করে http://juledia.blogspot.com/2004/07/compiled-vs-intermented-- ভাষাগুলি। Html
এবং এখানে একটি এন্ট্রি রয়েছে যা পাইথন সংকলন প্রক্রিয়াটি ব্যাখ্যা করে http://effbot.org/zone /python-compile.htm


9

ইতিমধ্যে উল্লিখিত হিসাবে, আপনি আপনার পাইথন কোডটি বাইকোডে সংকলন করে পারফরম্যান্স বৃদ্ধি পেতে পারেন। এটি সাধারণত আমদানি করা স্ক্রিপ্টগুলির জন্য পাইথন নিজেই পরিচালনা করেন।

আপনি আপনার পাইথন কোডটি সংকলন করতে চাইতে পারেন এমন আরও একটি কারণ হ'ল আপনার বৌদ্ধিক সম্পত্তি অনুলিপি করা এবং / বা সংশোধন করা থেকে রক্ষা করা যেতে পারে।

পাইথন ডকুমেন্টেশনে আপনি এটি সম্পর্কে আরও পড়তে পারেন ।


2
আপনার কোড রক্ষা করার ক্ষেত্রে - সংকলন পুরোপুরি সাহায্য করবে না। সংকলন অপ্রচলিত - তবে ইচ্ছা থাকা কেউ আপনার কোড নির্বিশেষে পাবেন।
জোশ স্মিটন

1
@ জোশ যা সর্বদা সম্ভব, যদি কেউ পর্যাপ্ত সময় সহ মেমরিটি অ্যাক্সেস করতে বা সিপিইউতে নির্দেশিকা দেখতে পারে এবং তারা আপনার অ্যাপটি পুনরায় তৈরি করতে পারে।
UnkwnTech

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

যে ভাষাগুলি বাইকোডে সংকলিত হয় সেগুলি সাধারণত বিপরীত-সংকলন করা এত কঠিন নয় যদি আপনি সেগুলি নিরস্ত করার জন্য অতিরিক্ত পদক্ষেপ না করেন - কেবল সংকলন সাধারণত পর্যাপ্ত হবে না।
ইজোশুয়াস - মনিকা

7

একটি সংকলিত স্ক্রিপ্ট চলাকালীন অবশ্যই পারফরম্যান্সের পার্থক্য রয়েছে। আপনি যদি সাধারণ .pyস্ক্রিপ্টগুলি চালনা করেন তবে মেশিনটি প্রতিবার চালিত হওয়ার সাথে সাথে এটি সংকলন করে এবং এটি সময় নেয়। আধুনিক মেশিনগুলিতে এটি খুব কমই লক্ষণীয় তবে স্ক্রিপ্টটি বাড়ার সাথে সাথে এটি সমস্যার কারণ হতে পারে।


7

সোর্স-টু-সোর্স-সংকলন হ'ল কিছু নয় । উদাহরণস্বরূপ, nuitkaপাইথন কোডটি সি / সি ++ তে অনুবাদ করে এবং এটি বাইনারি কোডে সংকলন করে যা সরাসরি সিপিইউতে চলে, পাইথন বাইটকোডের পরিবর্তে ধীর ভার্চুয়াল মেশিনে চলে।

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


4

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


2

হ্যাঁ, পারফরম্যান্সই মূল কারণ এবং যতদূর আমি জানি, এর একমাত্র কারণ।

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


1

নতুনরা ধরে নেন পাইথন .পিসি ফাইলের কারণে সংকলিত হয়েছে। .Pyc ফাইলটি সংকলিত বাইটকোড, যার পরে ব্যাখ্যা করা হয়। সুতরাং আপনি যদি নিজের পাইথন কোডটি আগে চালিত করে থাকেন এবং .pyc ফাইলটি ব্যবহার করেন তবে এটি দ্বিতীয়বার দ্রুত চলবে, কারণ এতে বাইকোডটি পুনরায় সংকলন করতে হবে না

সংকলক: একটি সংকলক কোডের একটি অংশ যা উচ্চ স্তরের ভাষাটিকে মেশিনের ভাষায় অনুবাদ করে

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

সূত্র: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/cont تقسیم/ differences- between- compiler- and- interpreter


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