Cython: для i от 1 <= i <N - PullRequest
       19

Cython: для i от 1 <= i <N

8 голосов
/ 10 ноября 2011

Я изучаю Cython и наткнулся на этот фрагмент кода:

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 , что составляет 2,5.Мой вопрос таков:

Является ли цикл for циклом Python, Cython или C?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

for..from представляется циклом Pyrex / Cython: http://docs.cython.org/src/userguide/language_basics.html#integer-for-loops

5 голосов
/ 10 ноября 2011

Скомпилируйте его и посмотрите: код C, который генерирует Cython, хорошо аннотирован.

  /* "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)));
  }

И поэтому сам цикл успешно превращен в C. Обратите внимание, что в наши дни Cython может обрабатывать диапазон естественным образом, поэтому более старый стиль «от 0 <= i <N» не требуется. Смысл введения (не Python) синтаксиса "for / from" заключался в том, чтобы указать, какие циклы должны быть C-ified. </p>

...