C-, , size , C-. Cython- :
@cname('__pyx_memoryview')
cdef class memoryview(object):
...
cdef object _size
...
@property
def size(self):
if self._size is None:
result = 1
for length in self.view.shape[:self.view.ndim]:
result *= length
self._size = result
return self._size
, , . , 3- , ( , 8 , , ).
size - size /, . , , size - cython.
a.size - cython python.
, @danny python-call, . , :
%%cython
...
def both():
a.size+a.shape[0]*a.shape[1]*a.shape[2]
,
>>> %timeit mv_size
22.5 ns ± 0.0864 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit mv_product
20.7 ns ± 0.087 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>>%timeit both
21 ns ± 0.39 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
. :
%%cython
...
def nothing():
pass
:
%timeit nothing
24.3 ns ± 0.854 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
: a.size - , , , , - .
: a __Pyx_memviewslice, __pyx_memoryview, . __Pyx_memviewslice :
struct __pyx_memoryview_obj;
typedef struct {
struct __pyx_memoryview_obj *memview;
char *data;
Py_ssize_t shape[8];
Py_ssize_t strides[8];
Py_ssize_t suboffsets[8];
} __Pyx_memviewslice;
, shape Cython-, C- (, , , 8 ?). : 8 ).
memview - , __pyx_memoryview_obj - C-, cython, , :
/* "View.MemoryView":328
*
* @cname('__pyx_memoryview')
* cdef class memoryview(object): # <<<<<<<<<<<<<<
*
* cdef object obj
*/
struct __pyx_memoryview_obj {
PyObject_HEAD
struct __pyx_vtabstruct_memoryview *__pyx_vtab;
PyObject *obj;
PyObject *_size;
PyObject *_array_interface;
PyThread_type_lock lock;
__pyx_atomic_int acquisition_count[2];
__pyx_atomic_int *acquisition_count_aligned_p;
Py_buffer view;
int flags;
int dtype_is_object;
__Pyx_TypeInfo *typeinfo;
};
, Pyx_memviewslice Python - , , shape stride, .
, a.size? __pyx_memoryview_fromslice, memview __Pyx_memviewslice -.
size , _size, Cython.
, - , shape, strides suboffsets, size, , , , - C- shape.