【发布时间】:2018-06-30 00:17:55
【问题描述】:
我应该如何在没有 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 的类似方法。
【问题讨论】:
-
为什么需要这个?你只需要真正释放 GIL 来执行多线程。在多个线程中使用
print很容易结束,最终会导致输出混乱。 -
@DavidW 我没有做任何多线程。我认为发布 GIL 会消除 Python 开销(这似乎是我错了?)。在我的例子中,我的代码的核心部分是一个大的 for 循环(大约 50 行代码),但这是我的猜测,我没有检查释放 GIL 是否有助于我的大代码。
-
听起来你不需要那么严格——仅仅拥有 GIL 不会让你慢下来。不需要 GIL 的代码通常更快(作为一般规则),但偶尔打印语句就可以了。
-
我认为这个有用的评论值得一看。我不知道什么是最好的,但请随时将其作为对我的问题的编辑或作为答案发布。