سؤال

في بيثون ، تحت أي ظرف من الظروف هو جرعة كبيرة خيار أفضل من ctypes على الدعوة نقاط الدخول في المكتبات المشتركة?دعونا نفترض أنك لم يكن لديك بالفعل جرعة كبيرة interface file(s).

ما هي مقاييس الأداء من اثنين ؟

هل كانت مفيدة؟

المحلول

جرعة كبيرة يولد (بدلا القبيح) C أو C++ code.هو بسيط لاستخدام وظائف بسيطة (الأشياء التي يمكن ترجمتها مباشرة) و معقول سهلة الاستخدام وظائف أكثر تعقيدا (مثل الوظائف مع معلمات الإخراج التي تحتاج إضافية الترجمة خطوة تمثل في بيثون.) أكثر قوة التواصل غالبا ما تحتاج إلى كتابة أجزاء من ج كجزء من واجهة الملف.عن أي شيء ولكن استخدام بسيط سوف تحتاج إلى معرفته حول CPython وكيف أنها تمثل الكائنات -- ليس من الصعب, ولكن شيء أن نأخذ في الاعتبار.

ctypes يسمح لك الوصول مباشرة إلى وظائف C, هياكل البيانات الأخرى و تحميل التعسفي المكتبات المشتركة.أنت لا تحتاج إلى كتابة أي ج عن هذا, ولكن تحتاج إلى فهم كيفية C يعمل.هو هل يمكن القول, الوجه الآخر جرعة كبيرة:لا تولد رمز وأنها لا تتطلب مترجم في وقت التشغيل, ولكن عن أي شيء ولكن استخدام بسيط أنها لا تتطلب أن تفهم كيف تسير الامور مثل C أنواع البيانات, صب, إدارة الذاكرة و عمل المحاذاة.تحتاج أيضا إلى يدويا أو تلقائيا ترجمة ج البنيات والنقابات صفائف إلى ما يعادل ctypes datastructure ، بما في ذلك الحق في تخطيط الذاكرة.

فمن المرجح أنه في نقي التنفيذ ، جرعة كبيرة أسرع من ctypes لأن الإدارة حول العمل الفعلي به في ج في compiletime بدلا من الثعبان في وقت التشغيل.ومع ذلك, إلا إذا كنت واجهة الكثير من مختلف C المهام لكن بعضها فقط بضع مرات ، فمن غير المرجح النفقات العامة سيتم ملحوظ حقا.

في وقت التطوير ، ctypes أقل بكثير تكلفة بدء التشغيل:لم يكن لديك لمعرفة المزيد عن واجهة الملفات لا يجب أن تولد .ج الملفات وتجميع لهم, ليس عليك أن تحقق والصمت التحذيرات.يمكنك فقط القفز في والبدء في استخدام واحد C تعمل مع الحد الأدنى من الجهد ، ثم توسع الأمر إلى أكثر من ذلك.وتحصل على اختبار ومحاولة الامور مباشرة مترجم بايثون.التفاف الكثير من التعليمات البرمجية مملة نوعا ما, على الرغم من أن هناك محاولات لجعل هذا أسهل (مثل ctypes-تكوين.)

جرعة كبيرة من ناحية أخرى ، يمكن أن تستخدم لإنشاء wrappers متعددة اللغات (ما عدا اللغة-تفاصيل محددة التي تحتاج إلى ملء في العرف كما ذكرت أعلاه.) عندما التفاف الكثير والكثير من التعليمات البرمجية التي تشرب يمكن التعامل مع القليل من المساعدة ، رمز جيل يمكن أيضا أن يكون الكثير أبسط إلى مجموعة من ctypes حكمه.

نصائح أخرى

لدي تجربة غنية استخدام جرعة كبيرة.جرعة كبيرة يدعي أنه هو حل سريع للالتفاف الأشياء.ولكن في الحياة الحقيقية...


سلبيات:

جرعة كبيرة وضعت على الجميع لمدة 20+ لغات.عموما ، فإنه يؤدي إلى السلبيات:
- احتياجات التكوين (جرعة كبيرة .أنا قوالب), في بعض الأحيان أنها صعبة ،
- عدم وجود علاج بعض الحالات الخاصة (انظر الثعبان خصائص إضافية),
- عدم أداء بعض اللغات.

بيثون سلبيات:

1) رمز نمط التناقض.C++ و الثعبان جدا رمز مختلف أنماط (وهذا هو واضح بالتأكيد), إمكانيات تشرب من صنع هدفا رمز أكثر Pythonish محدودة جدا.وكمثال على ذلك ، فقد بات القلب إلى خلق خصائص من حاصل على واضعي.انظر هذا q&a

2) عدم واسعة من المجتمع.جرعة كبيرة لديه بعض وثائق جيدة.ولكن إذا اشتعلت شيئا ليس في الوثائق ، هناك أي معلومات على الإطلاق.ولا مدونات ولا غوغلينغ يساعد.لذا على المرء أن بكثافة حفر جرعة كبيرة التعليمات البرمجية التي تم إنشاؤها في مثل هذه الحالات...هذا أمر فظيع ، يمكنني أن أقول...

الايجابيات:

  • في الحالات البسيطة ، هو حقا سريع, سهلة ومباشرة إلى الأمام

  • إذا كنت تنتج جرعة كبيرة واجهة الملفات مرة واحدة, يمكنك لف هذا رمز C++ إلى أي من غيرها من 20+ لغات (!!!).

  • هناك قلق كبير حول جرعة كبيرة الأداء.منذ الإصدار 2.04 جرعة كبيرة تشمل '-builtin' العلم مما يجعل جرعة كبيرة حتى أسرع من غيرها من طرق آلية التغليف.على الأقل بعض المعايير يدل على هذا.


عند استخدام جرعة كبيرة?

لذلك خلصت إلى لنفسي حالتين عند جرعة كبيرة هو جيد لاستخدام:

2) إذا كان أحد يحتاج إلى التفاف رمز C++ لعدة لغات.أو إذا كان يحتمل أن يمكن أن يكون هناك وقت عندما يحتاج المرء إلى توزيع التعليمات البرمجية لعدة لغات.استخدام جرعة كبيرة يمكن الاعتماد عليها في هذه الحالة.

1) إذا كان أحد يحتاج إلى بسرعة التفاف فقط عدة وظائف من مكتبة C للاستخدام النهائي.


تجربة حية

التحديث :
فمن سنة ونصف مرت كما فعلنا تحويل المكتبة باستخدام جرعة كبيرة.

أولا قمنا بعمل نسخة بايثون.كانت هناك العديد من اللحظات عندما واجهنا مشاكل مع جرعة كبيرة - صحيح.ولكن الآن نحن بتوسيع مكتبة جافا .صافي.لذلك لدينا 3 لغات مع 1 جرعة كبيرة.و أستطيع أن أقول أن جرعة كبيرة من الصخور من حيث توفير الكثير من الوقت.

تحديث 2:
فمن عامين ونحن استخدام جرعة كبيرة لهذه المكتبة.جرعة كبيرة متكاملة في بناء النظام.مؤخرا كان لدينا API كبير تغيير C++ المكتبة.جرعة كبيرة عملت تماما.الشيء الوحيد الذي يتعين علينا القيام به هو إضافة العديد من %إعادة تسمية .لقد الملفات لذلك لدينا CppCamelStyleFunctions() الآن looks_more_pythonish في بيثون.في البداية كنت قلقا حول بعض المشاكل التي يمكن أن تنشأ ، ولكن لا شيء ذهب على نحو خاطئ.كان من المدهش.فقط العديد من التعديلات و كل شيء وزعت في 3 لغة.الآن أنا واثق من أنه كان حلا جيدا أن استخدام جرعة كبيرة في حالتنا.

تحديث 3:
فمن+ 3 سنوات ونحن نستخدم جرعة كبيرة من أجل مكتبتنا. تغيير كبير:بيثون جزء تم إعادة كتابة تماما في بيثون نقية.والسبب هو أن الثعبان يستخدم الغالبية العظمى من تطبيقات لدينا مكتبة الآن.حتى لو كان الثعبان النقي الإصدار يعمل أبطأ من C++ تغليف, هو أكثر ملاءمة للمستخدمين العمل مع بيثون نقية, لا تكافح مع الأم المكتبات.

جرعة كبيرة لا تزال تستخدم .صافي إصدارات جافا.

والسؤال الرئيسي هنا "سوف نستخدم جرعة كبيرة من أجل الثعبان إذا بدأنا المشروع من البداية؟".فإننا!جرعة كبيرة تسمح لنا بسرعة توزيع منتجاتنا إلى العديد من اللغات.عملت لفترة من الزمن والذي أتاح لنا الفرصة لفهم أفضل المستخدمين المتطلبات.

CTypes رائع جدا و أسهل بكثير من جرعة كبيرة ، ولكن العيب أن ضعيف أو بسوء قصد-كتابة كود بايثون يمكن أن تحطم في الواقع الثعبان العملية.يجب عليك أن تنظر أيضا دفعة بيثون.IMHO هو في الواقع أسهل من جرعة كبيرة حين مما يتيح لك المزيد من السيطرة على نهائي الثعبان واجهة.إذا كنت تستخدم C++ على أي حال, أنت أيضا لا تضيف أي لغات أخرى إلى المزيج الخاص بك.

في تجربتي ، ctypes لديها عيب كبير:عندما يكون هناك شيء يذهب على نحو خاطئ (وأنه دائما سيكون لأي واجهات معقدة), يا التصحيح.

المشكلة أن جزء كبير من الكدسة تحجب ctypes/ffi السحر و لا توجد طريقة سهلة لتحديد كيف تحصل على نقطة معينة و لماذا المعلمة القيم هي ما هي عليه..

يمكنك أيضا استخدام بيركس, التي يمكن أن تكون بمثابة الغراء بين ارتفاع مستوى كود بايثون و على مستوى منخفض ج التعليمات البرمجية. lxml هو مكتوب في بيركس ، على سبيل المثال.

انا ذاهب الى أن تكون مناقضة وتشير إلى أنه إذا كان بإمكانك أن تكتب امتداد المكتبة باستخدام بيثون القياسية API.انها حقا متكامل من كل من C و Python منظور...إذا كان لديك أي خبرة مع بيرل API, سوف تجد أنه جدا مفاجأة سارة.

Ctypes هو لطيف جدا, ولكن كما قال آخرون إنها لا تفعل C++.

كيف كبيرة هي مكتبة تحاول والتفاف ؟ كيف بسرعة هل برنامج تغيير ؟ أي صيانة أخرى القضايا ؟ هؤلاء جميعا ربما تؤثر على اختيار أفضل طريقة لكتابة الثعبان الارتباطات.

ctypes كبيرة ، ولكن لا يعالج C++ الطبقات.لقد وجدت أيضا ctypes حوالي 10 ٪ أبطأ من المباشر ج ملزمة ، ولكن هذا سوف تعتمد بشكل كبير على ما يدعون.

إذا كنت تنوي الذهاب مع ctypes, بالتأكيد تحقق من Pyglet و Pyopengl المشاريع التي الهائل من الأمثلة ctype الارتباطات.

فقط أردت أن أضيف بعض الاعتبارات التي لم أرى المذكورة بعد.[تحرير:عذرا لم أرى مايك Steder الجواب]

إذا كنت تريد أن تجرب استخدام غير Cpython التنفيذ (مثل PyPy, IronPython أو Jython) ، ثم ctypes هو السبيل الوحيد للذهاب.PyPy لا تسمح الكتابة ج-امتداد ، بحيث يستبعد بيركس/cython وزيادة.بيثون.لنفس السبب ، ctypes هي الآلية الوحيدة التي سوف تعمل من أجل IronPython و (في نهاية المطاف ، بمجرد الحصول على كل العمل) jython.

كما شخص آخر المذكورة لا تجميع مطلوب.هذا يعني أنه إذا كان نسخة جديدة من .dll أو .حتى يخرج يمكنك مجرد قطرة في تحميل هذا الإصدار الجديد.طالما أن أيا من واجهات تغيرت انها قطرة في الاستبدال.

شيء أن نأخذ في الاعتبار هو أن تشرب أهداف فقط CPython التنفيذ.منذ ctypes أيضا PyPy و IronPython تطبيقات قد يكون من المفيد كتابة وحدات مع ctypes من أجل التوافق مع أوسع الثعبان البيئي.

لقد وجدت جرعة كبيرة أن تكون منتفخة قليلا في نهجه (في عام ، ليس فقط الثعبان) و من الصعب تنفيذها دون الحاجة إلى عبور نقطة حساسة من كتابة كود بايثون مع صريح عقلية أن تكون جرعة كبيرة ودية بدلا من كتابة نظيفة مكتوب كود بايثون.هو IMHO ، أكثر وضوحا عملية كتابة C الارتباطات إلى C++ (إذا باستخدام C++) ثم استخدام ctypes إلى واجهة أي ج طبقة.

إن المكتبة التي هي في الوصل لديه واجهة C كجزء من المكتبة ، ميزة أخرى ctypes هو أنك لا يجب أن تجميع منفصلة الثعبان-ملزمة المكتبة للوصول إلى طرف ثالث المكتبات.هذا هو لطيف للغاية في صياغة نقي الثعبان الحل أن يتجنب عبر منصة تجميع القضايا (على الطرف الثالث يبس عرضت على منصات متباينة).الحاجة إلى تضمين التعليمات البرمجية المترجمة إلى حزمة كنت ترغب في نشر مثل PyPi في عبر منصة بطريقة ودية هو الألم ؛ واحدة من بلدي معظم مزعجة نقاط عن الثعبان الحزم باستخدام جرعة كبيرة أو الكامنة صريحة ج المدونة العامة inavailability عبر منصة.لذلك نعتبر هذا إذا كنت تعمل عبر منصة المتاحة طرف ثالث المكتبات وتطوير الثعبان الحل من حولهم.

كما في العالم الحقيقي ، PyGTK.هذا (أعتقد) يستخدم جرعة كبيرة لتوليد التعليمات البرمجية C إلى واجهة GTK ج المكالمات.أنا استخدم هذا أقصر وقت فقط للعثور عليه الألم الحقيقي إعداده واستخدامه ، ملتوي الغريب الأخطاء إذا كنت لم تفعل الأشياء في الترتيب الصحيح على الإعداد فقط في العام.كانت تجربة محبطة و عندما نظرت في interace التعاريف التي قدمتها جتك على شبكة الإنترنت أدركت ما بسيط كسسيرسيسي سيكون من كتابة المترجم من تلك واجهة الثعبان ctypes واجهة.مشروع يسمى PyGGI ولدت في يوم من الأيام كنت قادرا على كتابة PyGTK أن تكون أكثر من ذلك بكثير functiona المنتج المفيد أن مباريات نظيفة إلى GTK ج-وجوه المنحى الواجهات.وأنها لا تتطلب تجميع ج-قانون مما يجعلها عبر منصة ودية.(لقد كان في الواقع بعد التواصل إلى webkitgtk التي ليس عبر منصة).أنا يمكن أيضا بسهولة نشر PyGGI إلى أي منصة تدعم GTK.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top