Notes about Cython
I’ve been working a lot with Cython recently. Cython is a programming language based on Pyrex, which gets translated and optimized into C++. You can use it to create optimized C++ extensions using a Python-like language or to glue existing C/C++ libraries with your Python codebase. It’s possible to expose objects both ways. Cython files are similar to C/C++ files in that there are header files (.pyd) and implementation files (.pxd). These are some collected random notes.
- All wrappers of C++ classes (using
cdef extern from) must be declared in the.pydfiles - Cython comes with two main commands.
cythoncommand takes a.pyxfile and produces a C/C++ file, while thecythonizecommand takes a glob of.pyxfiles and produces the resulting shared library (.sofile) - There’s currently no way to tell CLion to use cython from a specific virtualenv. The only way around this is to run
cmakeon the command line with your virtual environment active - if you then don’t reset the cache you can keep runningcmakein CLion as well and it will work. - There is a Cython plugin for
cmake(used byscikit-build, can be found here). This plugin allows you to create your extensions right fromcmake(it calls thecython/cythonizecommands under the hood), but it’s often much easier to letdistutils/setuptoolsdo it. - There is no good way to do incremental compilation of Cython code, because there is no way to compile multiple Cython files and link them into a single module. You can use Cython’s
includedirective to smoosh the Cython files into one and then build a module from that, but then you lose incremental compilation on the Cython code. If you have C++ code, you can still get incremental compilation on that part, if you use something likecmake. Your pure C++ code gets compiled into a shared library which then is used in your Cython extension. Alternatively, you split up your Cython code into several shared libraries, but then you get some code duplication as each library holds the same Python init code.