2

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

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

我的问题是,如果我如下所示,会不会一样?将变量声明放在函数之外?(真实案例不同,有2个以上的功能)

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
4

2 回答 2

1

原则上,cython 像 python 一样处理全局变量,无论它是 C 还是 Python 类型。查看常见问题解答的这一部分

因此,您的(第二个)示例不起作用,您必须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

但是,在这一点上,我想问一下,您是否真的需要这样做。很普遍,有很好的论据,为什么全局变量是坏的。因此,您可能会认真考虑重新考虑。

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

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

这至少会分别使用和覆盖您的示例func1和此处。func2y = 0y = 1

于 2013-08-06T11:01:11.160 回答
0

我进行了以下测试,我相信它可以在外部声明许多函数共享的变量,避免重复代码,无需指定 with 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.]
于 2013-08-05T11:39:24.477 回答