2024-06-09 19:47:59 发布
网友
我需要从python快速访问用cython编写的算法中使用的变量: 这是伪代码:
cpdef(double a, double b): while a < 100.: # some long-term calculations a = x
因为我从python调用它,所以我使用cpdef函数。用户需要一个长期计算进度的提示。这可以通过访问“a”变量来实现。但是在cpdef函数中不能使用引用参数(double&a)或指针(double*a)(编译器错误)。如何快速访问函数的局部变量?在
显示进度的一种非常标准的方法是使用回调,这不是cython特有的,而是通用的python,因此在cython中也能很好地工作。基于回调的方法在单线程和多线程程序中都可以工作,这与某些只适用于多线程程序的引用不同。使用回调会带来非常轻微的性能损失,但是如果代码只在几秒钟内调用回调100次(或者不管需要进度条多长时间),则根本不会注意到性能的影响,因为cython代码可以轻松地以每秒30000000次的速度调用python回调你做的事情和显示进度有很大的不同,回调应该可以完美地工作。在
下面是一个工作示例:
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元素,发送一条消息等。如果回调要做很多工作,只需确保不要太频繁地调用它(例如,在计算过程中每100次只调用一次)。在
显示进度的一种非常标准的方法是使用回调,这不是cython特有的,而是通用的python,因此在cython中也能很好地工作。基于回调的方法在单线程和多线程程序中都可以工作,这与某些只适用于多线程程序的引用不同。使用回调会带来非常轻微的性能损失,但是如果代码只在几秒钟内调用回调100次(或者不管需要进度条多长时间),则根本不会注意到性能的影响,因为cython代码可以轻松地以每秒30000000次的速度调用python回调你做的事情和显示进度有很大的不同,回调应该可以完美地工作。在
下面是一个工作示例:
使用回调可以很容易地调用任何类型的代码。在这个例子中,我只使用了一个python函数,但是你也可以在一个对象实例上传递一个方法(“绑定方法”),以打印到屏幕上,更新GUI元素,发送一条消息等。如果回调要做很多工作,只需确保不要太频繁地调用它(例如,在计算过程中每100次只调用一次)。在
相关问题 更多 >
编程相关推荐