পাইথন প্রোগ্রামকে সি / সি ++ কোডে রূপান্তর করবেন? [বন্ধ]


149

পাইথন প্রোগ্রামকে সি / সি ++ এ রূপান্তর করা কি সম্ভব?

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


32
পাইথন যতটা বেঞ্চমার্কে হারায়, মনে রাখবেন যে পাইথনের কয়েক সেকেন্ডের মধ্যে গণনা শেষ হয়ে গেলে 50x বা 100x ধীরগতি এখনও তুচ্ছ এবং যখন আপনি প্রচুর I / O করেন বা কোনও ভয়ঙ্কর অ্যালগরিদম হয় তখনও সত্য নয়। বরং জিজ্ঞাসার চেয়ে "পাইথনটি কত ধীর?" আপনার জিজ্ঞাসা করা উচিত "পাইথন কি যথেষ্ট দ্রুত?" (এবং এটি সর্বাধিক প্রস্তাবনা সহকারে) - এটি বেঞ্চমার্কিং বা জিজ্ঞাসা করার চেয়েও দ্রুত।

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

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

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

"x ঘন্টা"? এটা কত বড়? আপনি কি একটি বাস্তবায়ন বেঞ্চমার্ক করেছেন? আপনার কি পরিমাপ আছে? আপনি বাস্তবায়ন প্রোফাইল করেছেন? অথবা আপনি অকাল সময়ের আগে সমাধানটি অপ্টিমাইজ করার চেষ্টা করছেন?
এস .লট

উত্তর:


115

হ্যাঁ. সিথনের দিকে তাকান । এটি কেবল এটি করে: স্পিডআপসের জন্য পাইথনকে সি তে রূপান্তর করে।


6
অবশ্যই যদি আপনি একগুচ্ছ cdefঘোষণাগুলি যোগ না করেন এবং এর মাধ্যমে স্থির টাইপিংয়ের সূচনা না করেন তবে এগুলি আপনাকে কিছুটা সাশ্রয় করতে পারে না (অন্যথায় আপনি কেবল অস্বচ্ছ স্টাফগুলি জগল করেন PyObject *)। এবং এটি প্লেইন সি-এর মতো দ্রুত কখনই পাবেন না কারণ এটি পাইথনের সাথে সাধারণত ইন্টারফ্যাক্স করে (100% বা তার বেশি? কেবলমাত্র সরল সংখ্যাসূচক কোডের জন্য যা পাইথনের সাথে বেশিরভাগ সময় ইন্টারফেস করে না!)। তবে এটি ব্যতীত, হ্যাঁ, এটি আপনাকে একটি সুন্দর ডিভেন্ট গতিসম্পন্ন করতে পারে।

7
@ ডেলানান: আসলে, এটি আপনাকে কিছুটা বাঁচায়। সংকলনের পরে বেশিরভাগ খাঁটি পাইথন কোডটি দ্রুততর হবে। তবে হ্যাঁ, সিডিএফ এবং স্থির টাইপিংয়ের মাধ্যমে আপনি সত্যিই পার্থক্যগুলি দেখতে শুরু করেন। এবং পাইথনের সাথে ইন্টারফেসিং আপনি যে কোনও ক্ষেত্রে পাইথন থেকে সি ব্যবহার করেন।
লেনার্ট রেগেব্রো

136

যদি সি ভেরিয়েন্টটির x ঘন্টা কম প্রয়োজন, তবে আমি সেই সময়টি আলগোরিদিমগুলিকে আরও / দীর্ঘ সময় ধরে চালিয়ে দেওয়ার জন্য বিনিয়োগ করব

"বিনিয়োগ" এখানে সঠিক শব্দ নয়।

  1. পাইথনে একটি কার্যকরী বাস্তবায়ন তৈরি করুন। আপনি একটি সি সংস্করণ শেষ করার আগে আপনি এটি দীর্ঘ করতে হবে।

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

  3. যদি এটি এখনও খুব ধীর গতির হয় তবে ম্যানুয়ালি ভালভাবে ডিজাইন করা এবং সাবধানে নির্মিত পাইথন সিটিতে অনুবাদ করুন

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

এই উদ্ধৃতিটি গুরুত্বপূর্ণ।

প্রথমবারের দূরবীন প্রস্তুতকারকদের জন্য থম্পসনের বিধি
ছয় ইঞ্চির আয়না তৈরির চেয়ে চার ইঞ্চি আয়না এবং তারপরে ছয় ইঞ্চির আয়না তৈরি করা আরও দ্রুত।

বিল ম্যাককিনান
ওয়াং ইনস্টিটিউট


15
অসাধারণ স্কোর নির্বিশেষে, আমি দেখতে পাচ্ছি না কিভাবে এই প্রশ্নের উত্তর দেয়।
অড্রিয়াস মেসকাউস্কাস

29

শেড স্কিনটি "এ (সীমাবদ্ধ) পাইথন-টু-সি ++ সংকলক"।


3
শেড স্কিনের +1 এর একটি সুবিধা হ'ল টাইপ ইনফারেন্সন : প্রোগ্রাম প্রবাহ থেকে পরিবর্তনশীল ধরণের অনুমান করা যদি সম্ভব হয় তবে গতিশীল টাইপ-চেক করা এড়ানো যায়। এটি সাধারণত ছোট সি ++ কোডের দিকে পরিচালিত করে যে এটি পড়া সম্ভব এবং দ্রুত প্রোগ্রামগুলিতে সংকলন করা সম্ভব।
কিস তাও

1
রয়েছে পাইথন → 11l → সি ++ transpiler , যা সি ++ কম্পাইলার করার জন্য একটি সীমাবদ্ধ পাইথন, কিন্তু এটা কিছু পাইথন অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে, যা চালা চামড়া সঙ্গে সমর্থিত নয় (যেমন নেস্টেড ফাংশন / বন্ধ) সমর্থন করে।
টাভ

17

সবেমাত্র হ্যাকার সংবাদের এই নতুন সরঞ্জামটি জুড়ে এসেছিল ।

তাদের পৃষ্ঠা থেকে - "পাইথন দোভাষীর জন্য নূতকা একটি ভাল প্রতিস্থাপন এবং সিপিথন ২.6, ২.7, ৩.২ এবং ৩.৩ প্রস্তাবিত প্রতিটি নির্মাণকে কম্পাইল করে It এটি পাইথনকে একটি সি ++ প্রোগ্রামে অনুবাদ করে যা এরপরে" লিবিপথন "ব্যবহার করে একইভাবে কার্যকর হয় সিপিথন খুব সামঞ্জস্যপূর্ণ উপায়ে করে ""


এই প্রকল্পটি অন্যান্য অনুরূপ বিকল্পগুলির তুলনায় অনেক বেশি পরিপক্ক। এটি মজাদার এটি .exeওএসএক্স-এ এক্সটেনশনের সাথে বাইনারি তৈরি করে যদিও এটি একেবারে সাধারণ ওএসএক্স মাচ-ও এক্সিকিউটেবল। এটা দেখে মনে হচ্ছে একটি ভাল প্রতিস্থাপন হতে পারে pyinstaller, py2exe, py2app, ইত্যাদি --recurse-***পতাকা যদিও সঠিকভাবে সেট করতে গুরুত্বপূর্ণ।
সিসিপিজ্জা

নুইটকা দুর্দান্ত, তবে তৈরি সি / সি ++ কোডটি পাইওবজেক্ট ব্যবহার করছে যা সিপিথন-সি-কোড-প্রয়োগের সাথে আবদ্ধ। এটি আইডেম্যাটিক সি-কোড তৈরি করে না।
Make42

8

আরেকটি বিকল্প - শেড স্কিন ছাড়াও সি ++ তে রূপান্তর করার জন্য - পাইথ্রান

মিশা গোরেলিক এবং ইয়ান ওজভাল্ডের হাই পারফরম্যান্স পাইথনের উদ্ধৃতি দিতে :

পাইথরান হল পাইথন-এর-সি ++ সংকলক পাইথনের সাবসেটের জন্য আংশিক numpyসমর্থন অন্তর্ভুক্ত । এটি নুম্বা এবং সিথনের মতো কিছুটা কাজ করে — আপনি কোনও ফাংশনের যুক্তিগুলি বর্ননা করেন এবং তারপরে এটি আরও ধরণের টিকা এবং কোড বিশেষজ্ঞের সাথে নিয়ে যায়। এটি ভেক্টরাইজেশন সম্ভাবনা এবং ওপেনএমপি-ভিত্তিক সমান্তরালীন সম্ভাবনার সুবিধা গ্রহণ করে। এটি পাইথন ২.7 ব্যবহার করে চলে।

পাইথ্রানের একটি খুব আকর্ষণীয় বৈশিষ্ট্য হ'ল এটি স্বয়ংক্রিয়ভাবে সমান্তরালতার সুযোগগুলি চিহ্নিত করার চেষ্টা করবে (উদাহরণস্বরূপ, আপনি যদি ব্যবহার করছেন map) এবং আপনার কাছ থেকে অতিরিক্ত প্রচেষ্টা না করে এটিকে সমান্তরাল কোডে রূপান্তরিত করবে। আপনি pragma omp > নির্দেশাবলী ব্যবহার করে সমান্তরাল বিভাগগুলিও নির্দিষ্ট করতে পারেন ; এই ক্ষেত্রে, এটি সিথনের ওপেনএমপি সমর্থনের সাথে খুব মিল বলে মনে হচ্ছে।

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

আপনার মনে রাখা উচিত যে এই প্রকল্পটি তরুণ, এবং আপনি বাগগুলির মুখোমুখি হতে পারেন; আপনার এও লক্ষ করা উচিত যে বিকাশকারী দলটি খুব বন্ধুত্বপূর্ণ এবং কয়েক ঘন্টার মধ্যে বাগগুলি ঠিক করার ঝোঁক।


6

আমি জানি এটি একটি পুরানো থ্রেড তবে আমি যা দরকারী তথ্য বলে মনে করি তা দিতে চেয়েছিলাম।

আমি ব্যক্তিগতভাবে পাইপাই ব্যবহার করি যা পাইপ ব্যবহার করে ইনস্টল করা সত্যিই সহজ। আমি পরস্পর বদলে পাইথন / পাইপি ইন্টারপ্রেটার ব্যবহার করি, আপনার কোডটি একেবারেই বদলাতে হবে না এবং আমি এটি পাইথন 2 এক্স বা 3x এর উভয়ই পাইথন 2x বা 3x এর চেয়ে প্রায় 40x দ্রুত পেয়েছি to আমি আমার কোড পরিচালনা করতে পাইকার্ম কমিউনিটি সংস্করণ ব্যবহার করি এবং আমি এটি পছন্দ করি।

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

কিছু লোক আমার সাথে এটি নিয়ে তর্ক করতে পারে তবে আমি পাইপাইকে সাইথনের চেয়ে দ্রুততর বলে মনে করি। তবে তারা উভয়ই দুর্দান্ত পছন্দ।

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

আশা করি এইটি কাজ করবে.


2
আমি জানি এটি একটি পুরানো মন্তব্য, তবে ধন্যবাদ!
kfrncs

সমস্যা নেই, আমি খুশি যে এটি কার্যকর ছিল।
জ্যাকট্রেডার

পিপাই ব্যাখ্যা থেকে সংকলন করতে আপনি কোন সফ্টওয়্যার ব্যবহার করেন?
ভ্যাসিল ভাস্কিভস্কিই

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

1
পাইপাই সিথনের চেয়ে দ্রুত চালানোর জন্যও পেয়েছি। একটি পরীক্ষায় আমি পাইপাইটিকে প্রোগ্রামটির সি ++ সংস্করণের (সন্নিবেশ সাজানোর) মতো একই গতিতে পেয়েছি।
এনভি 7

5

আমি বুঝতে পারি যে বেশ নতুন সমাধানের একটি উত্তর অনুপস্থিত। যদি নম্পি কোডটিতে ব্যবহৃত হয় তবে আমি পাইথ্রান চেষ্টা করার পরামর্শ দেব:

http://pythran.readthedocs.io/

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

সিথনের সাথে তুলনা করা সুবিধাটি হ'ল আপনাকে কেবল পাইপথান ফাংশনে পাইপথান ব্যবহার করতে হবে নিম্পির জন্য অনুকূলিতকরণ, যার অর্থ আপনাকে লুপগুলি প্রসারিত করতে হবে না এবং লুপের সমস্ত ভেরিয়েবলের জন্য প্রকারগুলি যুক্ত করতে হবে না। পাইথ্রান কোড বিশ্লেষণ করতে সময় নেয় তাই এটি অপারেশনগুলি বুঝতে পারে numpy.ndarray

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

পাইথ্রানের একটি অপূর্ণতা: ক্লাস নেই! তবে যেহেতু কেবলমাত্র যে কার্যগুলি সত্যিকারের অনুকূলিত করা দরকার সেগুলি সঙ্কলন করতে হবে, এটি খুব বিরক্তিকর নয়।

আরেকটি বিষয়: পাইথ্রান ওপেনএমপি সমান্তরালতা ভাল (এবং খুব সহজেই) সমর্থন করে। তবে আমি মনে করি না এমপিআই 4পি সমর্থিত ...


4

http://code.google.com/p/py2c/ দেখতে একটি সম্ভাবনার মতো দেখায় - তারা তাদের সাইটেও উল্লেখ করে: সাইথন, শেডস্কিন এবং আরপিথন এবং নিশ্চিত করে যে তারা পাইথন কোডকে খাঁটি সি / সি ++ তে রূপান্তর করছে যা সি এর চেয়ে অনেক দ্রুতগতিযুক্ত is / সি ++ পাইথন এপিআই কলগুলির সাথে ধাঁধা। দ্রষ্টব্য: আমি চেষ্টা করে দেখিনি তবে আমি যাচ্ছি ..


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