.. currentmodule:: brian

.. _compiled-code:

Compiled code
=============

Compiled C code can be used in several places in Brian to get speed improvements in cases where performance
is the most important factor.

Weave
-----

Weave is a SciPy module that allows the use of inlined C++ code. Brian by default doesn't use any C++
optimisations for maximum compatibility across platforms, but you can enable several optimised
versions of Brian objects and functions by enabling weave compilation. See :ref:`preferences`
for more information.

See also :ref:`efficiency-vectorisation` for some information on writing your own inlined C++ code
using Weave.

C++ objects
-----------

For maximum compatibility, Brian works with pure Python only. However, as well as the optional
weave optimisations, there are also objects can run with a pure C++ version for a considerable speedup.
For this to work, you need a copy of the ``gcc`` compiler installed (either on Linux, Mac or through cygwin on Windows)
to build them. During installation (via ``easy_install``, ``pip`` or with ``python setup.py install``), two objects
are compiled automatically: `brian.utils.fastexp.fastexp` (providing a fast, approximate exponential function) and
`brian.utils.ccircular.ccircular` (a circular array data structure). If the compilation fails, a warning message
will be displayed and the pure Python versions used instead.

In addition, it is possible to compile a C++ version of a more recent datastructure underlying the Synapses object, the `SpikeQueue`.
To compile this object, follow these instructions: 

In a command prompt or shell window, go to the directory where Brian is installed. On Windows this
will probably be ``C:\Python27\lib\site-packages\brian``. Now
go to the ``experimental/cspikequeue`` folder. If you're on Linux (and this may also work for Mac) run
the command ``python setup.py build_ext --inplace``. If you're on Windows you'll need to have cygwin with gcc
installed, and then you run ``setup.py build_ext --inplace -c mingw32`` instead. You should see some
compilation, possibly with some warnings but no errors.

If all works OK, you should see a UserWarning when importing Brian. You can uninstall (and effectively switch off) the use of the C++ SpikeQueue by removing the ``*.so`` file in the ``experimental/cspikequeue/`` directory. Repeating the steps above (i.e. recompiling the object) will re-enable the C SpikeQueue.

The same steps can also be used for compiling the `ccircular` or `fastexp` if they were not already compiled automatically during installation, just navigate
to the respective directory. 

Automatically generated C code
------------------------------

There is an experimental module for automatic generation of C code, see
:ref:`experimental-codegen`. 
