Clone this wiki locally
The bug tracker has a list of the major improvements.
- New directives
c_string_encodingto more easily and automatically convert between C strings and the different Python string types.
- The extension type flag
Py_TPFLAGS_HAVE_VERSION_TAGis enabled by default on extension types and can be disabled using the
- 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_tarrays for strings. Note that the
Py_UNICODEtype is otherwise deprecated as of CPython 3.3.
isinstance(obj, basestring)is optimized. In Python 3 it only tests for instances of
basestringbuiltin is mapped to
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
.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 Nonesuppresses 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.
General Improvements and Bug Fixes
- 2-value slicing of unknown objects passes the correct slice when the
getitemprotocol is used instead of the
getsliceprotocol (especially in Python 3), i.e.
Nonevalues 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
__defaults__attribute was not writable for Cython implemented functions.
- Default values of keyword-only arguments showed up in
__kwdefaults__(which was not implemented). Both are available for Cython implemented functions now, as specified in Python 3.x.
yieldworks inside of
with gilsections. 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.values()no longer return lists in Python 3.
- Exiting from an
except-asclause now deletes the exception in Python 3 mode.
- The declarations of