我需要从python快速访问用cython编写的算法中使用的变量: 这是伪代码:
cpdef(double a, double b):
while a < 100.:
# some long-term calculations
a = x
因为我从python中调用它,所以使用cpdef函数。用户需要提示长期计算的进度。这可以通过访问&#34; a&#34;变量。但是不可能在cpdef函数中使用引用参数(double&amp; a)或指针(double * a)(编译器错误)。如何快速访问函数的局部变量?
答案 0 :(得分:2)
显示进度的一种非常标准的方法是使用回调,这不是特定于cython,而是一般的python,因此在cython中也能正常工作。基于回调的方法可以在单线程和多线程程序中使用,不像某种类型的引用只适用于多线程程序。使用回调会导致非常轻微的性能损失,但是如果您的代码仅在几秒钟内调用回调100次(或者需要多长时间才需要进度条),您将不会注意到性能影响所有,因为cython代码可以轻松地将回调调用到python 30,000,000次/ s。因此,除非你做一些与显示进度完全不同的事情,否则回调应该可以正常工作。
这是一个有效的例子:
cpdef foo(double a, double b, object callback=None):
while a < 100:
a += 1
# some long-term calculations
if callback is not None:
callback(a)
def progress(a):
print(a)
foo(0, 0, progress)
使用回调可以轻松调用任何类型的代码。在示例中我只使用python函数,但您也可以在对象实例上传入一个方法(一个'绑定方法')来打印到屏幕,更新GUI元素,发送消息等。如果回调是做很多工作只是确保你不要经常调用它(即只计算一次,每过一百次通过计算)。