2011-11-10 11 views
8

<:Cython: i 1'den <= i <a href="http://www.cython.org">Cython</a> öğrenme ve bu kod SNIPPIT geldi ediyorum N

import numpy as np 
cimport numpy as np 

def mean(np.ndarray[np.double_t] input): 

    cdef np.double_t cur 
    # Py_ssize_t is numpy's index type 
    cdef Py_ssize_t i 
    cdef Py_ssize_t N = len(input) 

    for i from 0 <= i < N: 
     cur += input[i] 

    return cur/N 

a=np.array([1,2,3,4], dtype=np.double) 

Açıkçası, bu 2.5 olan bir ortalamasını döndürür. Soruma şu soru soruldu:

For döngüsü bir Python döngüsü, Cython veya C?

cevap

5

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.

+0

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ı: –

+1

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

5

for..from

bir Pyrex/Cython döngü gibi görünüyor. Bunu onaylayan var mı? Sadece bu özel snippitin yazarının modern koddaki eski yapıyı kullanmayı tercih ettiğini merak ediyorum.
+1

Doğru. Cython'un geriye dönük uyumluluk için tuttuğu döngü için Pyrex formudur. – rossipedia

İlgili konular