Thinking Hybrid - Python/C++ Integration

  • 8,065 views
Uploaded on

Talk on integrating native C++ sensibly into Python for ease of use of the code base. Inheriting from C++ classes, overriding functionality, automatically generating the bindings using Py++ and …

Talk on integrating native C++ sensibly into Python for ease of use of the code base. Inheriting from C++ classes, overriding functionality, automatically generating the bindings using Py++ and SCons.

Code demonstrated in the presentation can be found here:

http://www.kloss-familie.de/moin/TalksPresentations

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Học cách trình bày ở đây
    Are you sure you want to
    Your message goes here
  • That's exactly the thing that makes C/C++ so different from most other languages. It distinguishes between reference and value calls. Python does not know about these things. People have tried to resolve this problem by trying to guess which calling method is correct in a place. But as in the Zen of Python is already stated 'Explicit is better than implicit.' So we don't want the system to guess as things can go terribly wrong. Therefore, so called 'calling policies' (mentioned on slide 32 in the flash animation here) have to be used to disambiguate in a way that the programmer wants.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
8,065
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
389
Comments
2
Likes
14

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Python Extending/Integrating A Real World Example Tips Summary Python where we can, C++ where we must Source: http://xkcd.com/353/ Guy K. Kloss — Python where we can,C++ where we must 1/28
  • 2. Python Extending/Integrating A Real World Example Tips Summary Python where we can, C++ where we must∗ Guy K. Kloss BarCamp Auckland 2007 15 December 2007 ∗ Quote: Alex Martelli, Senior Google Developer Guy K. Kloss — Python where we can,C++ where we must 2/28
  • 3. Python Extending/Integrating A Real World Example Tips Summary Outline 1 Python 2 Extending/Integrating 3 A Real World Example 4 Tips Guy K. Kloss — Python where we can,C++ where we must 3/28
  • 4. Python Extending/Integrating A Real World Example Tips Summary Outline 1 Python 2 Extending/Integrating 3 A Real World Example 4 Tips Guy K. Kloss — Python where we can,C++ where we must 4/28
  • 5. Python Extending/Integrating A Real World Example Tips Summary What is Python? Object–oriented Dynamic Easy to learn syntax High-level data types Scripting language Embeddable in C/C++ Guy K. Kloss — Python where we can,C++ where we must 5/28
  • 6. Python Extending/Integrating A Real World Example Tips Summary Python vs. Java (or C++) No compilation Fast edit–build–debug cycle Dynamic Typing No need to declare variables for use Easy Syntax No curly braces, no semicolons, no new . . . Embeddable Scripting support for your applications Interactive Create, view, change objects at runtime 50% less code Compact and natural syntax 300% more productive Closer to the way you think Guy K. Kloss — Python where we can,C++ where we must 6/28
  • 7. Python Extending/Integrating A Real World Example Tips Summary Why Python? Mixable Extend Python with components written in C++, Java, C Embed Python into your application and call it from C/C++ Platform independent Powerful Ease of use of scripting language Built-in object types Extensive libraries Automatic memory management Modules, classes and exceptions Guy K. Kloss — Python where we can,C++ where we must 7/28
  • 8. Python Extending/Integrating A Real World Example Tips Summary What is Python used for? System Utilities System admin tools, portable shell scripts Internet Scripting CGI scripts, parse HTML, process XML, email tools User Interfaces (UIs) & rapid prototyping Component Glue Scripting for apps, COM scripting Distributed Programming Web Services, COM, CORBA, XML–RPC Database Programming Scientific Computing PyODE, NumPy, SciPy, PyMol, . . . Image Processing Python Image Library OpenGL Programming, Writing Games PyOpenGL, Panda3D, PyOgre, Py3d, VisualPython Artifical Intelligence Guy K. Kloss — Python where we can,C++ where we must 8/28
  • 9. Python Extending/Integrating A Real World Example Tips Summary Why Native Code? C/C++, Fortran (and Java, C#, ...) Performance Binding to legacy code (Existing) Applications/Libraries . . . ... want to be scripted ... want to be tested ... want to be re-used Guy K. Kloss — Python where we can,C++ where we must 9/28
  • 10. Python Extending/Integrating A Real World Example Tips Summary Outline 1 Python 2 Extending/Integrating 3 A Real World Example 4 Tips Guy K. Kloss — Python where we can,C++ where we must 10/28
  • 11. Python Extending/Integrating A Real World Example Tips Summary What if I could . . . Use this code more effectively . . . ? [NaSt2D demonstration (native executable)] Guy K. Kloss — Python where we can,C++ where we must 11/28
  • 12. Python Extending/Integrating A Real World Example Tips Summary Extending/Integration The Contestants: The “classic way” . . . Extending and Embedding the Python Interpreter The “new way” . . . Python ctypes SWIG Boost.Python Others: SIP Pythonizer SILOON (Pyrex) Extensions also for Java, C#, Fortran, . . . available Guy K. Kloss — Python where we can,C++ where we must 12/28
  • 13. Python Extending/Integrating A Real World Example Tips Summary Extending/Integration The Contestants: The “classic way” . . . Extending and Embedding the Python Interpreter The “new way” . . . Python ctypes SWIG Boost.Python Others: SIP Pythonizer SILOON (Pyrex) Extensions also for Java, C#, Fortran, . . . available Guy K. Kloss — Python where we can,C++ where we must 12/28
  • 14. Python Extending/Integrating A Real World Example Tips Summary Extending/Integration The Contestants: The “classic way” . . . Extending and Embedding the Python Interpreter The “new way” . . . Python ctypes SWIG Boost.Python Others: SIP Pythonizer SILOON (Pyrex) Extensions also for Java, C#, Fortran, . . . available Guy K. Kloss — Python where we can,C++ where we must 12/28
  • 15. Python Extending/Integrating A Real World Example Tips Summary Extending/Integration The Contestants: The “classic way” . . . Extending and Embedding the Python Interpreter The “new way” . . . Python ctypes SWIG Boost.Python Others: SIP Pythonizer SILOON (Pyrex) Extensions also for Java, C#, Fortran, . . . available Guy K. Kloss — Python where we can,C++ where we must 12/28
  • 16. Python Extending/Integrating A Real World Example Tips Summary Extending/Integration The Contestants: The “classic way” . . . Extending and Embedding the Python Interpreter The “new way” . . . Python ctypes SWIG Boost.Python Others: SIP Pythonizer SILOON (Pyrex) Extensions also for Java, C#, Fortran, . . . available Guy K. Kloss — Python where we can,C++ where we must 12/28
  • 17. Python Extending/Integrating A Real World Example Tips Summary Boost.Python Thinking Hybrid with Boost.Python Bottom up and . . . Top down possible Develop quickly Resolve bottle necks Donald Knuth’s: “Premature optimisation is the root of all evil.” or: Don’t Optimise Now! Guy K. Kloss — Python where we can,C++ where we must 13/28
  • 18. Python Extending/Integrating A Real World Example Tips Summary Boost.Python Thinking Hybrid with Boost.Python Bottom up and . . . Top down possible Develop quickly Resolve bottle necks Donald Knuth’s: “Premature optimisation is the root of all evil.” or: Don’t Optimise Now! Guy K. Kloss — Python where we can,C++ where we must 13/28
  • 19. Python Extending/Integrating A Real World Example Tips Summary Boost.Python Thinking Hybrid with Boost.Python Bottom up and . . . Top down possible Develop quickly Resolve bottle necks Donald Knuth’s: “Premature optimisation is the root of all evil.” or: Don’t Optimise Now! Guy K. Kloss — Python where we can,C++ where we must 13/28
  • 20. Python Extending/Integrating A Real World Example Tips Summary Hello World char const* greet(unsigned x) { static char const* const msgs[] = {quot;helloquot;, quot;Boost.Pythonquot;, quot;world!quot;}; if (x > 2) { throw std::range error(quot;greet: Index out of range.quot;); } return msgs[x]; } #include <boost/python.hpp> using namespace boost::python; BOOST PYTHON MODULE(hello) { .def(quot;greetquot;, greet, quot;return one of 3 parts of a greetingquot;); } And here it is in action: >>> import hello >>> for x in range(3): ... print hello.greet(x) ... hello Boost.Python world! Guy K. Kloss — Python where we can,C++ where we must 14/28
  • 21. Python Extending/Integrating A Real World Example Tips Summary Boost.Python One of a few libraries that make it easy to integrate C++ and Python code How does it pull off this trick? Template meta–programming (i. e. Don’t ask!) Guy K. Kloss — Python where we can,C++ where we must 15/28
  • 22. Python Extending/Integrating A Real World Example Tips Summary Boost.Python One of a few libraries that make it easy to integrate C++ and Python code How does it pull off this trick? Template meta–programming (i. e. Don’t ask!) Guy K. Kloss — Python where we can,C++ where we must 15/28
  • 23. Python Extending/Integrating A Real World Example Tips Summary See it Happen I’m making it work for you now . . . [“MyClass” demonstration (MyClass.cpp, MyClass.h, mymodule.cpp)] Guy K. Kloss — Python where we can,C++ where we must 16/28
  • 24. Python Extending/Integrating A Real World Example Tips Summary Outline 1 Python 2 Extending/Integrating 3 A Real World Example 4 Tips Guy K. Kloss — Python where we can,C++ where we must 17/28
  • 25. Python Extending/Integrating A Real World Example Tips Summary A Real World Example Re-visiting NaSt2D Wrapping NaSt2D Control the code Guy K. Kloss — Python where we can,C++ where we must 18/28
  • 26. Python Extending/Integrating A Real World Example Tips Summary NaSt2D in Python This is what I’m going to show you: Code to be wrapped Generated wrapper code Generator script SCons (build system) How it works with Python [Wrapped NaSt2D demonstration (Wrapper.h, nast2dmodule.cpp, generate bindings.py, SConstruct, demo0.py)] Guy K. Kloss — Python where we can,C++ where we must 19/28
  • 27. Python Extending/Integrating A Real World Example Tips Summary Extend Wrapper Class Inheriting from C++ classes Interfacing numerical values Change functionality Follow the Computation Guy K. Kloss — Python where we can,C++ where we must 20/28
  • 28. Python Extending/Integrating A Real World Example Tips Summary Overriding in Python This is what I’m going to show you: Overriding a native method in Python Native method needs to be “virtual” Live data plotting with GNUplot [NaSt2D with plotting demonstration (demo1.py, demo2.py)] Guy K. Kloss — Python where we can,C++ where we must 21/28
  • 29. Python Extending/Integrating A Real World Example Tips Summary Do more Computations Parameter Study Change input file Compute several cases Plot results automatically Guy K. Kloss — Python where we can,C++ where we must 22/28
  • 30. Python Extending/Integrating A Real World Example Tips Summary Automating in Python This is what I’m going to show you: Using a template input file Batch–calculating several runs Plotting results with GNUplot [NaSt2D with parameter variation demonstration (demo3.py, demo4.py)] Guy K. Kloss — Python where we can,C++ where we must 23/28
  • 31. Python Extending/Integrating A Real World Example Tips Summary Outline 1 Python 2 Extending/Integrating 3 A Real World Example 4 Tips Guy K. Kloss — Python where we can,C++ where we must 24/28
  • 32. Python Extending/Integrating A Real World Example Tips Summary Tips To override C++ methods: make them virtual C/C++ pit fall Call by reference/value Solution: calling policies Map to “other/sane” languages Java: Jython C#: IronPython Fortran: PyFort, Py2F (Native to other: SWIG) Guy K. Kloss — Python where we can,C++ where we must 25/28
  • 33. Python Extending/Integrating A Real World Example Tips Summary Summary Why is Python good for you? How can performance bottle necks be resolved? Advantages of “Thinking Hybrid” Python–native wrapping using Boost.Python Automated wrapper generation SCons build system Guy K. Kloss — Python where we can,C++ where we must 26/28
  • 34. Python Extending/Integrating A Real World Example Tips Summary Python and the “Need for Speed” Cuong Do – Software Architect YouTube.com “Python is fast enough for our site and allows us to produce maintainable features in record times, with a minimum of developers.” Guy K. Kloss — Python where we can,C++ where we must 27/28
  • 35. Python Extending/Integrating A Real World Example Tips Summary Questions? G.Kloss@massey.ac.nz Guy K. Kloss — Python where we can,C++ where we must 28/28