All Versions
Latest Version
Avg Release Cycle
49 days
Latest Release
754 days ago

Changelog History
Page 9

  • v0.14 Changes

    December 14, 2010

    🔋 Features added

    • Python classes can now be nested and receive a proper closure at definition time.

    • 👍 Redefinition is supported for Python functions, even within the same scope.

    • 👍 Lambda expressions are supported in class bodies and at the module level.

    • 👍 Metaclasses are supported for Python classes, both in Python 2 and Python 3 syntax. The Python 3 syntax (using a keyword argument in the type declaration) is preferred and optimised at compile time.

    • "final" extension classes prevent inheritance in Python space. This feature is available through the new "" decorator. In the future, these classes may receive further optimisations.

    • "internal" extension classes do not show up in the module dictionary. This feature is available through the new "cython.internal" decorator.

    • ⚠ Extension type inheritance from builtin types, such as "cdef class MyUnicode(unicode)", now works without further external type redeclarations (which are also strongly discouraged now and continue to issue a warning).

    • 📄 GDB support.

    • 👷 A new build system with support for inline distutils directives, correct dependency tracking, and parallel compilation.

    • 👌 Support for dynamic compilation at runtime via the new cython.inline function and cython.compile decorator.

    • 👍 "nogil" blocks are supported when compiling pure Python code by writing "with cython.nogil".

    • ⚡️ Iterating over arbitrary pointer types is now supported, as is an optimized version of the in operator, e.g. x in ptr[a:b].

    🐛 Bugs fixed

    • In parallel assignments, the right side was evaluated in reverse order in 0.13. This could result in errors if it had side effects (e.g. function calls).

    • In some cases, methods of builtin types would raise a SystemError instead of an AttributeError when called on None.

    Other changes

    • Constant tuples are now cached over the lifetime of an extension module, just like CPython does. Constant argument tuples of Python function calls are also cached.

    • Closures have tightened to include exactly the names used in the inner functions and classes. Previously, they held the complete locals of the defining function.

    • The builtin "next()" function in Python 2.6 and later is now implemented internally and therefore available in all Python versions. This makes it the preferred and portable way of manually advancing an iterator.

    • ⬆️ In addition to the previously supported inlined generator expressions in 0.13, "sorted(genexpr)" can now be used as well. Typing issues were fixed in "sum(genexpr)" that could lead to invalid C code being generated. Other known issues with inlined generator expressions were also fixed that make upgrading to 0.14 a strong recommendation for code that uses them. Note that general generators and generator expressions continue to be not supported.

    • 👍 Inplace arithmetic operators now respect the cdivision directive and are supported for complex types.

    • Typing a variable as type "complex" previously gave it the Python object type. It now uses the appropriate C/C++ double complex type. A side-effect is that assignments and typed function parameters now accept anything that Python can coerce to a complex, including integers and floats, and not only complex instances.

    • Large integer literals pass through the compiler in a safer way. To prevent truncation in C code, non 32-bit literals are turned into Python objects if not used in a C context. This context can either be given by a clear C literal suffix such as "UL" or "LL" (or "L" in Python 3 code), or it can be an assignment to a typed variable or a typed function argument, in which case it is up to the user to take care of a sufficiently large value space of the target.

    • 🚀 Python functions are declared in the order they appear in the file, rather than all being created at module creation time. This is consistent with Python and needed to support, for example, conditional or repeated declarations of functions. In the face of circular imports this may cause code to break, so a new --disable-function-redefinition flag was added to revert to the old behavior. This flag will be removed in a future release, so should only be used as a stopgap until old code can be fixed.

  • v0.13 Changes

    August 25, 2010

    🔋 Features added

    • 🚀 Closures are fully supported for Python functions. Cython supports inner functions and lambda expressions. Generators and generator expressions are not supported in this release.

    • 👍 Proper C++ support. Cython knows about C++ classes, templates and overloaded function signatures, so that Cython code can interact with them in a straight forward way.

    • 🐎 Type inference is enabled by default for safe C types (e.g. double, bint, C++ classes) and known extension types. This reduces the need for explicit type declarations and can improve the performance of untyped code in some cases. There is also a verbose compile mode for testing the impact on user code.

    • Cython's for-in-loop can iterate over C arrays and sliced pointers. The type of the loop variable will be inferred automatically in this case.

    • ✅ The Py_UNICODE integer type for Unicode code points is fully supported, including for-loops and 'in' tests on unicode strings. It coerces from and to single character unicode strings. Note that untyped for-loop variables will automatically be inferred as Py_UNICODE when iterating over a unicode string. In most cases, this will be much more efficient than yielding sliced string objects, but can also have a negative performance impact when the variable is used in a Python context multiple times, so that it needs to coerce to a unicode string object more than once. If this happens, typing the loop variable as unicode or object will help.

    • 👍 The built-in functions any(), all(), sum(), list(), set() and dict() are inlined as plain for loops when called on generator expressions. Note that generator expressions are not generally supported apart from this feature. Also, tuple(genexpr) is not currently supported - use tuple([listcomp]) instead.

    • 🗄 More shipped standard library declarations. The python_* and stdlib/stdio .pxd files have been deprecated in favor of clib.* and cpython[.*] and may get removed in a future release.

    • Pure Python mode no longer disallows non-Python keywords like 'cdef', 'include' or 'cimport'. It also no longer recognises syntax extensions like the for-from loop.

    • 🚀 Parsing has improved for Python 3 syntax in Python code, although not all features are correctly supported. The missing Python 3 features are being worked on for the next release.

    • from future import print_function is supported in Python 2.6 and later. Note that there is currently no emulation for earlier Python versions, so code that uses print() with this future import will require at least Python 2.6.

    • 🆕 New compiler directive language_level (valid values: 2 or 3) with corresponding command line options -2 and -3 requests source code compatibility with Python 2.x or Python 3.x respectively. Language level 3 currently enforces unicode literals for unprefixed string literals, enables the print function (requires Python 2.6 or later) and keeps loop variables in list comprehensions from leaking.

    • Loop variables in set/dict comprehensions no longer leak into the surrounding scope (following Python 2.7). List comprehensions are unchanged in language level 2.

    • 🖨 print >> stream

    🐛 Bugs fixed

    Other changes

    • 0️⃣ The availability of type inference by default means that Cython will also infer the type of pointers on assignments. Previously, code like this::

      cdef char* s = ... untyped_variable = s

    would convert the char* to a Python bytes string and assign that. This is no longer the case and no coercion will happen in the example above. The correct way of doing this is through an explicit cast or by typing the target variable, i.e.


     cdef char* s = ...
     untyped_variable1 = <bytes>s
     untyped_variable2 = <object>s
     cdef object py_object = s
     cdef bytes  bytes_string = s
    • 0️⃣ bool is no longer a valid type name by default. The problem is that it's not clear whether bool should refer to the Python type or the C++ type, and expecting one and finding the other has already led to several hard-to-find bugs. Both types are available for importing: you can use from cpython cimport bool for the Python bool type, and from libcpp cimport bool for the C++ type. bool is still a valid object by default, so one can still write bool(x).

    • __getsegcount__ is now correctly typed to take a Py_size_t* rather than an int*.

  • v0.12.1 Changes

    February 02, 2010

    🔋 Features added

    • Type inference improvements.

      • There have been several bug fixes and improvements to the type inferencer.
      • Notably, there is now a "safe" mode enabled by setting the infer_types directive to None. (The None here refers to the "default" mode, which will be the default in 0.13.) This safe mode limits inference to Python object types and C doubles, which should speed up execution without affecting any semantics such as integer overflow behavior like infer_types=True might. There is also an infer_types.verbose option which allows one to see what types are inferred.
    • The boundscheck directive works for lists and tuples as well as buffers.

    • 👍 len(s) and s.decode("encoding") are efficiently supported for char* s.

    • 🏁 Cython's INLINE macro has been renamed to CYTHON_INLINE to reduce conflict and has better support for the MSVC compiler on Windows. It is no longer clobbered if externally defined.

    • 📦 Revision history is now omitted from the source package, resulting in a 85% size reduction. Running make repo will download the history and turn the directory into a complete Mercurial working repository.

    • ⚠ Cython modules don't need to be recompiled when the size of an external type grows. (A warning, rather than an error, is produced.) This should be helpful for binary distributions relying on NumPy.

    🐛 Bugs fixed

    • 🚀 Several other bugs and minor improvements have been made. This release should be fully backwards compatible with 0.12.

    Other changes

  • v0.12 Changes

    November 23, 2009

    🔋 Features added

    • Type inference with the infer_types directive

    • 👍 Seamless C++ complex support

    • 🆕 Fast extension type instantiation using the normal Python meme obj =

    • 👌 Improved support for Py3.1

    • Cython now runs under Python 3.x using the 2to3 tool

    • ✅ unittest support for doctests in Cython modules

    • Optimised handling of C strings (char*): for c in cstring[2:50] and cstring.decode()

    • Looping over c pointers: for i in intptr[:50].

    • pyximport improvements

    • cython_freeze improvements

    🐛 Bugs fixed

    • 🛠 Many bug fixes

    Other changes

    • Many other optimisation, e.g. enumerate() loops, parallel swap assignments (a,b = b,a), and unicode.encode()

    • More complete numpy.pxd

  • v0.11.2 Changes

    May 20, 2009

    🔋 Features added

    • 👍 There's now native complex floating point support! C99 complex will be used if complex.h is included, otherwise explicit complex arithmetic working on all C compilers is used. [Robert Bradshaw]


      cdef double complex a = 1 + 0.3j
      cdef np.ndarray[np.complex128_t, ndim=2] arr = \
         np.zeros(10, np.complex128)
    • 👀 Cython can now generate a main()-method for embedding of the Python interpreter into an executable (see :issue:289) [Robert Bradshaw]

    • @wraparound directive (another way to disable arr[idx] for negative idx) [Dag Sverre Seljebotn]

    • 👍 Correct support for NumPy record dtypes with different alignments, and "cdef packed struct" support [Dag Sverre Seljebotn]

    • @callspec directive, allowing custom calling convention macros [Lisandro Dalcin]

    🐛 Bugs fixed

    Other changes

    • 🐛 Bug fixes and smaller improvements. For the full list, see [1].