Commit 559449a2 authored by Stefan Behnel's avatar Stefan Behnel

update docs on optimised builtins

--HG--
extra : rebase_source : fb47cc7e0154abb172016f1945dad2968b3f2a3e
parent cb945502
...@@ -572,43 +572,52 @@ Function Pointers ...@@ -572,43 +572,52 @@ Function Pointers
* Functions declared in a ``struct`` are automatically converted to function pointers. * Functions declared in a ``struct`` are automatically converted to function pointers.
* see **using exceptions with function pointers** * see **using exceptions with function pointers**
Python Built-ins Python Built-ins
================ ================
The following are provided: Cython compiles calls to most built-in functions into direct calls to
the corresponding Python/C API routines, making them particularly fast.
.. todo:: incomplete Only direct function calls using these names are optimised. If you do
something else with one of these names that assumes it's a Python object,
such as assign it to a Python variable, and later call it, the call will
be made as a Python function call.
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| Function and arguments | Return type | Python/C API Equivalent | | Function and arguments | Return type | Python/C API Equivalent |
+==============================+=============+============================+ +==============================+=============+============================+
| abs(obj) | object | PyNumber_Absolute | | abs(obj) | object, | PyNumber_Absolute, fabs, |
| | double, ... | fabsf, ... |
+------------------------------+-------------+----------------------------+
| callable(obj) | bint | PyObject_Callable |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| bool(obj) | object | Py_True, Py_False | | delattr(obj, name) | None | PyObject_DelAttr |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| chr(obj) | object | char | | exec(code, [glob, [loc]]) | object | - |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| delattr(obj, name) | int | PyObject_DelAttr | | dir(obj) | list | PyObject_Dir |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| dir(obj) | object | PyObject_Dir | | divmod(a, b) | tuple | PyNumber_Divmod |
| getattr(obj, name) (Note 1) | | |
| getattr3(obj, name, default) | | |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| hasattr(obj, name) | int | PyObject_HasAttr | | getattr(obj, name, [default])| object | PyObject_GetAttr |
| (Note 1) | | |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| hash(obj) | int | PyObject_Hash | | hasattr(obj, name) | bint | PyObject_HasAttr |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| intern(obj) | object | PyObject_InternFromString | | hash(obj) | int / long | PyObject_Hash |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| isinstance(obj, type) | int | PyObject_IsInstance | | intern(obj) | object | Py*_InternFromString |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| issubclass(obj, type) | int | PyObject_IsSubclass | | isinstance(obj, type) | bint | PyObject_IsInstance |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| iter(obj) | object | PyObject_GetIter | | issubclass(obj, type) | bint | PyObject_IsSubclass |
+------------------------------+-------------+----------------------------+
| iter(obj, [sentinel]) | object | PyObject_GetIter |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| len(obj) | Py_ssize_t | PyObject_Length | | len(obj) | Py_ssize_t | PyObject_Length |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| pow(x, y, z) (Note 2) | object | PyNumber_Power | | pow(x, y, [z]) | object | PyNumber_Power |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| reload(obj) | object | PyImport_ReloadModule | | reload(obj) | object | PyImport_ReloadModule |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
...@@ -617,6 +626,11 @@ The following are provided: ...@@ -617,6 +626,11 @@ The following are provided:
| setattr(obj, name) | void | PyObject_SetAttr | | setattr(obj, name) | void | PyObject_SetAttr |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
Note 1: Pyrex originally provided a function :func:`getattr3(obj, name, default)`
corresponding to the three-argument form of the Python builtin :func:`getattr()`.
Cython still supports this function, but the usage is deprecated in favour of
the normal builtin, which Cython can optimise in both forms.
============================ ============================
Error and Exception Handling Error and Exception Handling
......
...@@ -387,35 +387,48 @@ Python variable residing in the scope where it is assigned. ...@@ -387,35 +387,48 @@ Python variable residing in the scope where it is assigned.
Built-in Functions Built-in Functions
------------------ ------------------
Cython compiles calls to the following built-in functions into direct calls to Cython compiles calls to most built-in functions into direct calls to
the corresponding Python/C API routines, making them particularly fast. the corresponding Python/C API routines, making them particularly fast.
Only direct function calls using these names are optimised. If you do
something else with one of these names that assumes it's a Python object,
such as assign it to a Python variable, and later call it, the call will
be made as a Python function call.
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| Function and arguments | Return type | Python/C API Equivalent | | Function and arguments | Return type | Python/C API Equivalent |
+==============================+=============+============================+ +==============================+=============+============================+
| abs(obj) | object | PyNumber_Absolute | | abs(obj) | object, | PyNumber_Absolute, fabs, |
| | double, ... | fabsf, ... |
+------------------------------+-------------+----------------------------+
| callable(obj) | bint | PyObject_Callable |
+------------------------------+-------------+----------------------------+
| delattr(obj, name) | None | PyObject_DelAttr |
+------------------------------+-------------+----------------------------+
| exec(code, [glob, [loc]]) | object | - |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| delattr(obj, name) | int | PyObject_DelAttr | | dir(obj) | list | PyObject_Dir |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| dir(obj) | object | PyObject_Dir | | divmod(a, b) | tuple | PyNumber_Divmod |
| getattr(obj, name) (Note 1) | | |
| getattr3(obj, name, default) | | |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| hasattr(obj, name) | int | PyObject_HasAttr | | getattr(obj, name, [default])| object | PyObject_GetAttr |
| (Note 1) | | |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| hash(obj) | int | PyObject_Hash | | hasattr(obj, name) | bint | PyObject_HasAttr |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| intern(obj) | object | PyObject_InternFromString | | hash(obj) | int / long | PyObject_Hash |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| isinstance(obj, type) | int | PyObject_IsInstance | | intern(obj) | object | Py*_InternFromString |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| issubclass(obj, type) | int | PyObject_IsSubclass | | isinstance(obj, type) | bint | PyObject_IsInstance |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| iter(obj) | object | PyObject_GetIter | | issubclass(obj, type) | bint | PyObject_IsSubclass |
+------------------------------+-------------+----------------------------+
| iter(obj, [sentinel]) | object | PyObject_GetIter |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| len(obj) | Py_ssize_t | PyObject_Length | | len(obj) | Py_ssize_t | PyObject_Length |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| pow(x, y, z) (Note 2) | object | PyNumber_Power | | pow(x, y, [z]) | object | PyNumber_Power |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
| reload(obj) | object | PyImport_ReloadModule | | reload(obj) | object | PyImport_ReloadModule |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
...@@ -424,17 +437,10 @@ the corresponding Python/C API routines, making them particularly fast. ...@@ -424,17 +437,10 @@ the corresponding Python/C API routines, making them particularly fast.
| setattr(obj, name) | void | PyObject_SetAttr | | setattr(obj, name) | void | PyObject_SetAttr |
+------------------------------+-------------+----------------------------+ +------------------------------+-------------+----------------------------+
Note 1: There are two different functions corresponding to the Python Note 1: Pyrex originally provided a function :func:`getattr3(obj, name, default)`
:func:`getattr` depending on whether a third argument is used. In a Python corresponding to the three-argument form of the Python builtin :func:`getattr()`.
context, they both evaluate to the Python :func:`getattr` function. Cython still supports this function, but the usage is deprecated in favour of
the normal builtin, which Cython can optimise in both forms.
Note 2: Only the three-argument form of :func:`pow` is supported. Use the
``**`` operator otherwise.
Only direct function calls using these names are optimised. If you do
something else with one of these names that assumes it's a Python object, such
as assign it to a Python variable, and later call it, the call will be made as
a Python function call.
Operator Precedence Operator Precedence
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment