簡體   English   中英

Cython:如何在沒有GIL的情況下打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM