接收全局变量(Cython)

时间:2017-09-14 15:39:26

标签: python cython

我在jupyter笔记本中使用Cython。

据我所知,Cython编译def函数。

但是当我想用全局变量调用函数时,它并没有看到它。

有没有方法用变量调用函数?

one1 = 1
%%cython
cimport numpy as np
cdef nump(number1):
    return number1 + 1
nump(one1)

****这是示例代码,用于显示版主

2 个答案:

答案 0 :(得分:3)

Ipython会话中,我可以这样做:

In [2]: %load_ext Cython
In [3]: one = 1
In [4]: %%cython
   ...: def foo(num):
   ...:    return num + 1
   ...: 
In [5]: foo(one)
Out[5]: 2

那就是我定义一个cython函数,但是用Python调用全局变量。

如果我使用cdef定义函数,我需要使用def函数调用它。从Python中看不到fooc

In [9]: %%cython
   ...: cdef fooc(num):
   ...:    return num + 2
   ...: def foo_call(num):
   ...:    return fooc(num)
   ...: 
In [10]: foo_call(one)
Out[10]: 3

如果我尝试在one文件(魔术单元格)中使用cython,我会收到错误,相当于Python NameError

In [8]: %%cython
   ...: cdef fooc(num):
   ...:    return num + 2
   ...: print(fooc(one))
   ...: 

Error compiling Cython file:
...
/home/paul/.cache/ipython/cython/....: undeclared name not builtin: one

在魔法单元格中看不到ipython会话变量one

在@ DavidW的回答中,这个import有效:

In [14]: %%cython
    ...: from __main__ import one
    ...: cdef fooc(num):
    ...:    return num + 2
    ...: print(fooc(one))
    ...: 
3

无法从Python访问此fooc

请注意,import在编译时使用one的值。

In [22]: %%cython
    ...: from __main__ import one
    ...: cdef fooc(num):
    ...:    return num + 20
    ...: def fooc_call():
    ...:    print(fooc(one))
    ...: 
    ...: 
In [23]: fooc_call()
21
In [24]: one=343           # new value
In [25]: fooc_call()        # no change
21
In [26]: foo_call(one)     # uses the current value
Out[26]: 345

答案 1 :(得分:2)

您的代码有一些错误,但我认为您要问的是错误的一行nump(one1)

  

undeclared name not builtin: one1

这是因为您的%%cython代码段基本上是在自己的模块中构建的。 jupyter中的%%cython魔法更适用于创建可在主代码中访问的编译函数,而不是访问主代码中的变量。

一种解决方案是添加行

from __main__ import *

在您的Cython区块开始时,可​​以访问"顶级"范围。 @hpaulj发布的答案表明了在Cython中定义函数并在块外部使用它们的更好方法。