[英]Cython: How to print without 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
。
這是評論中討論的后續行動,這些討論表明這個問題是基於一個輕微的誤解:總是值得思考為什么你需要釋放GIL以及你是否真的需要這樣做。
從根本上說,GIL是每個線程持有的標志,用於指示是否允許調用Python API。 簡單地拿着旗幟不會讓你失去任何表現。 Cython通常在不使用Python API時速度最快,但這是因為它執行的操作類型而不是因為它持有標志(即printf
可能比Python print
稍快,但printf
運行速度相同或不同GIL)。
你真正需要擔心GIL的唯一一次是在使用多線程代碼時,釋放它會讓其他Python線程有機會運行。 (同樣,如果你正在編寫一個庫而你不需要Python API,那么釋放GIL可能是一個好主意,這樣你的用戶可以根據需要運行其他線程)。
最后,如果你在一個nogil
塊中並且想要快速進行Python操作,你可以簡單地做:
with gil:
print c
有可能它不會花費你太多的性能,它可以節省大量的編程工作。
從stdio
使用printf
:
from libc.stdio cimport printf
...
printf("%f\n", c)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.