Cython v0.19 Release Notes

Release Date: 2013-04-19 // about 11 years ago
  • 🔋 Features added

    • New directives c_string_type and c_string_encoding to more easily and automatically convert between C strings and the different Python string types.

    • The extension type flag Py_TPFLAGS_HAVE_VERSION_TAG is enabled by default on extension types and can be disabled using the type_version_tag compiler directive.

    • 👍 EXPERIMENTAL support for simple Cython code level line tracing. Enabled by the "linetrace" compiler directive.

    • Cython implemented functions make their argument and return type annotations available through the __annotations__ attribute (PEP 3107).

    • Access to non-cdef module globals and Python object attributes is faster.

    • Py_UNICODE* coerces from and to Python unicode strings. This is helpful when talking to Windows APIs, which use compatible wchar_t arrays for strings. Note that the Py_UNICODE type is otherwise deprecated as of CPython 3.3.

    • isinstance(obj, basestring) is optimised. In Python 3 it only tests for instances of str (i.e. Py2 unicode).

    • The basestring builtin is mapped to str (i.e. Py2 unicode) when compiling the generated C code under Python 3.

    • Closures use freelists, which can speed up their creation quite substantially. This is also visible for short running generator expressions, for example.

    • A new class decorator @cython.freelist(N) creates a static freelist of N instances for an extension type, thus avoiding the costly allocation step if possible. This can speed up object instantiation by 20-30% in suitable scenarios. Note that freelists are currently only supported for base types, not for types that inherit from others.

    • 🆕 Fast extension type instantiation using the Type.__new__(Type) idiom has gained support for passing arguments. It is also a bit faster for types defined inside of the module.

    • The Python2-only dict methods .iter*() and .view*() (requires Python 2.7) are automatically mapped to the equivalent keys/values/items methods in Python 3 for typed dictionaries.

    • Slicing unicode strings, lists and tuples is faster.

    • list.append() is faster on average.

    • 👻 raise Exception() from None suppresses the exception context in Py3.3.

    • 👍 Py3 compatible exec(tuple) syntax is supported in Py2 code.

    • 👍 Keyword arguments are supported for cdef functions.

    • 🛠 External C++ classes can be declared nogil. Patch by John Stumpo. This fixes trac ticket 805.

    🐛 Bugs fixed

    • 2-value slicing of unknown objects passes the correct slice when the getitem protocol is used instead of the getslice protocol (especially in Python 3), i.e. None values for missing bounds instead of [0,maxsize]. It is also a bit faster in some cases, e.g. for constant bounds. This fixes trac ticket 636.

    • Cascaded assignments of None values to extension type variables failed with a TypeError at runtime.

    • 0️⃣ The __defaults__ attribute was not writable for Cython implemented functions.

    • 0️⃣ Default values of keyword-only arguments showed up in __defaults__ instead of __kwdefaults__ (which was not implemented). Both are available for Cython implemented functions now, as specified in Python 3.x.

    • yield works inside of with gil sections. It previously lead to a crash. This fixes trac ticket 803.

    • Static methods without explicitly named positional arguments (e.g. having only *args) crashed when being called. This fixes trac ticket 804.

    • dir() without arguments previously returned an unsorted list, which now gets sorted as expected.

    • dict.items(), dict.keys() and dict.values() no longer return lists in Python 3.

    • 👻 Exiting from an except-as clause now deletes the exception in Python 3 mode.

    • The declarations of frexp() and ldexp() in math.pxd were incorrect.

    Other changes