Derleyin ve bakın: Cython'un ürettiği C kodu güzel bir şekilde açıklamalıdır.
/* "cyexample.pyx":11
* cdef Py_ssize_t N = len(input)
*
* for i from 0 <= i < N: # <<<<<<<<<<<<<<
* cur += input[i]
*
*/
__pyx_t_1 = __pyx_v_N;
for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
/* "cyexample.pyx":12
*
* for i from 0 <= i < N:
* cur += input[i] # <<<<<<<<<<<<<<
*
* return cur/N
*/
__pyx_t_2 = __pyx_v_i;
__pyx_t_3 = -1;
if (__pyx_t_2 < 0) {
__pyx_t_2 += __pyx_bshape_0_input;
if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 0;
} else if (unlikely(__pyx_t_2 >= __pyx_bshape_0_input)) __pyx_t_3 = 0;
if (unlikely(__pyx_t_3 != -1)) {
__Pyx_RaiseBufferIndexError(__pyx_t_3);
{__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
}
__pyx_v_cur = (__pyx_v_cur + (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_double_t *, __pyx_bstruct_input.buf, __pyx_t_2, __pyx_bstride_0_input)));
}
Böylece döngü kendisi başarıyla C haline getirilir tarzı gerekli değildir "i < N = 0 < gelen" bu Cython işleyebilir bu gün aralığını doğal, yani daha büyük dikkat edin. Sözdizimi için "Python olmayan" (non-Python) ifadesinin tanıtımı, hangi döngülerin C-ified olması gerektiğini göstermektir.
http://docs.cython.org/src/userguide/language_basics.html#integer-for-loops bazı naif sürümüyle gelen timeit testleri ve hem döngü yapıları büyük dizi boyutu ile aynı sürede yaklaşık çalıştırmak için görünür yaptı: –
Döngünün içinde, Cython, 'menzil (10) 'için' i optimize etmeyecek, bu yüzden aslında 10'luk bir liste oluşturacak ve Python geri aramalarını kullanarak yinelemeli. Bu sebepten dolayı, Pyrex/Cython, C ... 'ye kadar azalacak olan sözdizimini ... için tanıttı. Bazen eski sözdizimini kullanıyorum, çünkü bu kodun daha iyi hale getirilmesi daha açık. – carl