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