问题描述
我应该如何在没有GIL的Cython功能中使用print?例如:
from libc.math cimport log, fabs cpdef double f(double a, double b) nogil: cdef double c = log( fabs(a - b) ) print c return c
编译时给出此错误:
Error compiling Cython file: ... print c ^ ------------------------------------------------------------ Python print statement not allowed without gil ...
我知道如何使用c库,而不是它们的python等效(例如math库),但是我找不到print的类似方法.
推荐答案
使用printf来自stdio:
from libc.stdio cimport printf ... printf("%f\n", c)
其他推荐答案
这是评论中讨论的后续措施,该评论表明这个问题是基于稍微误解的:始终值得考虑为什么您需要释放GIL以及您是否真的需要这样做.
从根本上讲,GIL是每个线程所符合的标志,以指示是否允许调用Python API.简单地持有国旗并不花您任何表现.当不使用Python API时,Cython通常是最快的,但这是因为它正在执行的操作,而不是因为它持有标志(即printf可能比Python printf运行printf可能会稍快有或没有GIL的相同速度).
您真正需要担心GIL的唯一一次是使用多线程代码时,它将其发布为其他Python线程提供了运行的机会. (同样,如果您正在编写库,并且不需要Python API,那么释放GIL可能是一个好主意,因此您的用户可以根据需要运行其他线程).
最后,如果您在一个nogil块中,并且想做一个快速的python操作,则可以简单地做:
with gil: print c
机会不会花费您太多的性能,并且可能会节省很多编程工作.
相关问答
相关标签/搜索