Python 的 for 和 while 循環是靈活并且高級的,語法自然、讀起來像偽代碼。而 Cython 也支持 for 和 while,無需修改。但由于循環通常占據程序運行時的大部分時間,因此我們可以通過一些優化,確保 Cython 能夠將 Python 循環轉換為高效的 C 循環。
n=100
foriinrange(n):
...
上面是一個標準的 Python for 循環,如果這個 i 和 n 是靜態類型,那么 Cython 就能生成更快的 C 代碼。
cdef Py_ssize_t i, n = 100
for i in range(n):
...
# 這段代碼和下面的C代碼是等效的
"""
for (i=0; i
所以當通過 range 進行循環時,我們應該將 range 里面的參數以及循環變量換成 C 的整型。如果不顯式地進行靜態聲明的話,Cython 就會采用最保守的策略:
cdef Py_ssize_t n = 100
for i in range(n):
print(i + 2 ** 100)
在循環的時候,如果我們使用了變量 i,那么在和一個數字相加的時候,由于 Cython 無法確定是否會發生溢出,因此會保守的選擇 Python 的整型。
如果我們能保證表達式中一定不會發生溢出,那么可以顯式地將 i 也聲明為 C 的整數類型。
當然不光是整型,其它的 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 提前聲明循環變量的類型
# 然后遍歷以及操作的時候,速度會快很多
# 因為我們實現了基于類型的優化
以上是 for 循環,至于 while 循環也是同理,說白了還是規定好類型,實現基于類型的優化。
審核編輯:湯梓紅
-
循環
+關注
關注
0文章
92瀏覽量
16042 -
C代碼
+關注
關注
1文章
89瀏覽量
14357 -
python
+關注
關注
56文章
4807瀏覽量
85040
發布評論請先 登錄
相關推薦
評論