Python 的 for 和 while 循環(huán)是靈活并且高級的,語法自然、讀起來像偽代碼。而 Cython 也支持 for 和 while,無需修改。但由于循環(huán)通常占據(jù)程序運行時的大部分時間,因此我們可以通過一些優(yōu)化,確保 Cython 能夠?qū)?Python 循環(huán)轉(zhuǎn)換為高效的 C 循環(huán)。
n=100
foriinrange(n):
...
上面是一個標(biāo)準的 Python for 循環(huán),如果這個 i 和 n 是靜態(tài)類型,那么 Cython 就能生成更快的 C 代碼。
cdef Py_ssize_t i, n = 100
for i in range(n):
...
# 這段代碼和下面的C代碼是等效的
"""
for (i=0; i
所以當(dāng)通過 range 進行循環(huán)時,我們應(yīng)該將 range 里面的參數(shù)以及循環(huán)變量換成 C 的整型。如果不顯式地進行靜態(tài)聲明的話,Cython 就會采用最保守的策略:
cdef Py_ssize_t n = 100
for i in range(n):
print(i + 2 ** 100)
在循環(huán)的時候,如果我們使用了變量 i,那么在和一個數(shù)字相加的時候,由于 Cython 無法確定是否會發(fā)生溢出,因此會保守的選擇 Python 的整型。
如果我們能保證表達式中一定不會發(fā)生溢出,那么可以顯式地將 i 也聲明為 C 的整數(shù)類型。
當(dāng)然不光是整型,其它的 Python 類型也可以提前聲明,舉個例子:
cdef list lst = [
{"name": "satori", "age": 17},
{"name": "koishi", "age": 16},
{"name": "marisa", "age": 15},
]
# lst 里面都是字典,在遍歷之前可以提前聲明好
cdef dict item
for item in lst:
print(f"{item['name']}, {item['age']}")
"""
satori, 17
koishi, 16
marisa, 15
"""
# 通過 cdef dict item 提前聲明循環(huán)變量的類型
# 然后遍歷以及操作的時候,速度會快很多
# 因為我們實現(xiàn)了基于類型的優(yōu)化
以上是 for 循環(huán),至于 while 循環(huán)也是同理,說白了還是規(guī)定好類型,實現(xiàn)基于類型的優(yōu)化。
審核編輯:湯梓紅
-
循環(huán)
+關(guān)注
關(guān)注
0文章
92瀏覽量
16282 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14729 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86457
發(fā)布評論請先 登錄
技術(shù)干貨驛站 ▏深入理解C語言:嵌套循環(huán)與循環(huán)控制的底層原理

可靠性溫度循環(huán)試驗至少需要幾個循環(huán)?

使用Python實現(xiàn)xgboost教程
AMC7812和STM32F407進行硬件I2C通信,為什么總是停在第三個while循環(huán)里?
深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

評論