用函数外部的cdef声明的变量在函数内部是否具有相同的类型?

时间:2013-08-05 11:05:46

标签: python variables global-variables cython variable-declaration

我在同一模块的所有函数中使用了许多相同类型的变量:

def func1(double x):
    cdef double a,b,c
    a = x
    b = x**2
    c = x**3
    return a+b+c

def func2(double x):
    cdef double a,b,c
    a = x+1
    b = (x+1)**2
    c = (x+1)**3
    return a+b+c

我的问题是,如果我这样做,它会是一样的吗?将变量声明置于函数外部? (真实情况不同,有两个以上的功能)

cdef double a,b,c

def func1(double x):
    a = x+2
    b = (x+2)**2
    c = (x+2)**3
    return a+b+c

def func2(double x):
    a = x+2
    b = (x+2)**2
    c = (x+2)**3
    return a+b+c

2 个答案:

答案 0 :(得分:1)

原则上,cython处理全局变量就像python一样,无论它是C还是Python类型。看看this part of the FAQ

所以你的(第二个)例子不起作用,你必须在你的函数开头使用global variable,如下所示:

def func2(double x):
    global a, b, c
    a = x + 2
    b = (x + 2) ** 2
    c = (x + 2) ** 3
    return a + b + c

然而,在这一点上,我想问一下,你是否真的需要这样做。一般来说,有很好的论据,为什么global variables are bad。所以你真的想重新考虑一下。

我认为,你的三个双打只是一个玩具的例子,所以我不确定你的实际用例是什么。从你的(第一个)例子来看,重用代码可以通过用另一个参数扩展函数来完成,如下所示:

def func(double x, double y=0):
    cdef double a, b, c
    a = x + y
    b = (x + y) ** 2
    c = (x + y) ** 3
    return a + b + c

这至少会分别使用func1func2覆盖您的示例y = 0y = 1

答案 1 :(得分:0)

我做了以下测试,我相信它可以声明外部许多函数共享的变量,避免重复代码,而无需使用global指定。

_test.pyx文件中:

import numpy as np
cimport numpy as np
cdef np.ndarray a=np.ones(10, dtype=FLOAT)
cdef np.ndarray b=np.ones(10, dtype=FLOAT)
cdef double c=2.
cdef int d=5

def test1(double x):
    print type(a), type(b), type(c), type(d)
    print a + c*b + 1*c*x + d

def test2(double x):
    print type(a), type(b), type(c), type(d)
    print a + c*b + 2*c*x + d

test.py文件中:

import pyximport; pyximport.install()
import _test

_test.test1(10.)
_test.test2(10.)

给出:

<type 'numpy.ndarray'> <type 'numpy.ndarray'> <type 'float'> <type 'int'>
[ 28.  28.  28.  28.  28.  28.  28.  28.  28.  28.]
<type 'numpy.ndarray'> <type 'numpy.ndarray'> <type 'float'> <type 'int'>
[ 48.  48.  48.  48.  48.  48.  48.  48.  48.  48.]