Cython:如何在没有GIL的情况下打印

时间:2018-01-21 03:31:50

标签: python cython cythonize

如何在没有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的类似方法。

2 个答案:

答案 0 :(得分:8)

这是评论中讨论的后续行动,这些评论表明这个问题是基于一个轻微的误解:它总是值得思考为什么你需要释放GIL以及你是否真的需要做它

基本上,GIL是每个线程持有的标志,用于指示是否允许调用Python API。简单地拿着旗帜并不会让你失去任何表现。不使用Python API时,Cython通常最快,但这是因为它执行的操作类型而不是因为它持有标志(即printf可能比Python print略快,但是无论有没有GIL,printf都会以相同的速度运行。

你真正需要担心GIL的唯一一次是在使用多线程代码时,释放它会让其他Python线程有机会运行。 (同样,如果你正在编写一个库并且你不需要Python API,那么发布GIL可能是一个好主意,这样你的用户可以根据需要运行其他线程。)

最后,如果您在nogil块中,并且想要快速进行Python操作,则可以执行以下操作:

with gil:
    print c

它很有可能不会让你获得太多的性能,并且可能会节省大量的编程工作。

答案 1 :(得分:7)

使用printf中的stdio

from libc.stdio cimport printf
...
printf("%f\n", c)
相关问题