Cython。如何在没有GIL的情况下进行打印[英] Cython: How to print without GIL

本文是小编为大家收集整理的关于Cython。如何在没有GIL的情况下进行打印的处理方法,想解了Cython。如何在没有GIL的情况下进行打印的问题怎么解决?Cython。如何在没有GIL的情况下进行打印问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我应该如何在没有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

机会不会花费您太多的性能,并且可能会节省很多编程工作.

本文地址:https://www.itbaoku.cn/post/1793834.html