python调用c++类内静态函数_Python与C++混合编程 - 2.4 - 使用局部静态对象
項目地址:
https://github.com/tushushu/EssentialCython?github.com
參考書籍: 《Essential C++ 中文版》
編程環境: MacOS + Jupyter Notebook + Python 3.6
%load_ext Cython
2.4 使用局部靜態對象
2.1節的fibon_elem()函數每次被調用時,便計算出斐波那契數列從1到pos的所有值(其中pos是由用戶指定),然后返回。這里花費了一些不必要的工夫。請看以下對fibon_elem()的三次調用:
1. fibon_elem(24)
2. fibon_elem(8)
3. fibon_elem(18)
其實第一次調用便已經計算出第二次、第三次調用所需要計算的值。我們可以考慮把計算結果緩存起來,如果下一次函數調用的時候結果已經存在于緩存中,則不需要重新計算。 如果在file scope定義緩存對象會過于冒險,打亂不同函數間的獨立性。另外一個解法就是局部靜態對象,與局部對象不同,它在每次函數調用的時候不會被重新創建,所以適合當作緩存。
因為Cython還不支持static變量,所以我們先創建chapter_2_extern.cpp和chapter_2_extern.h文件,用C++編寫這個函數。注意fibon_elem要放在_fibon_elem之后定義,否則會報錯。
#include "chapter_2_extern.h"
static void _fibon_elem(int pos, int &elem, vector &cache)
{
elem = 1;
if (pos == 1 || pos == 2)
{
cache.push_back(elem);
cache.push_back(elem);
cache.push_back(elem);
}
int i = cache.size() - 1;
int n_1 = cache[i - 1];
int n_2 = cache[i];
for (; i < pos; ++i)
{
elem = n_1 + n_2;
n_1 = n_2;
n_2 = elem;
cache.push_back(elem);
}
}
static int fibon_elem(int pos, int &elem)
{
static vector cache;
if (pos <= 0 || pos > 1024)
{
elem = 0;
return 0;
}
if (pos >= cache.size())
{
_fibon_elem(pos, elem, cache);
return 1;
}
elem = cache[pos];
return 2;
}
創建chapter_2.pyx文件,編寫Cython代碼來加載這個函數,并編寫fibon_elem_py函數供外部Python程序調用。
from libcpp cimport bool
from libcpp.vector cimport vector
cdef extern from "chapter_2_extern.h":
void _fibon_elem(int pos, int &elem, vector[int] &cache)
int fibon_elem(int pos, int &elem)
def fibon_elem_py(pos):
cdef int _elem = 0
sucess = fibon_elem(pos, _elem)
return _elem, sucess
然后通過執行python setup.py build_ext --inplace命令,將代碼編譯為.so文件,這樣就可以import fibon_elem_py函數來測試啦。
from chapter_2 import fibon_elem_py
for pos in [1, 2, 3, 4, 8, 5, 6, 1025]:
elem, sucess = fibon_elem_py(pos)
if sucess == 1:
msg = f"計算成功, 第{pos}個位置的元素值為{elem}!"
elif sucess == 2:
msg = f"調用緩存, 第{pos}個位置的元素值為{elem}!"
else:
msg = f"計算失敗, 參數為{pos}, 超過了合法范圍!"
print(msg)
計算成功, 第1個位置的元素值為1!
調用緩存, 第2個位置的元素值為1!
計算成功, 第3個位置的元素值為2!
計算成功, 第4個位置的元素值為3!
計算成功, 第8個位置的元素值為21!
調用緩存, 第5個位置的元素值為5!
調用緩存, 第6個位置的元素值為8!
計算失敗, 參數為1025, 超過了合法范圍!
總結
以上是生活随笔為你收集整理的python调用c++类内静态函数_Python与C++混合编程 - 2.4 - 使用局部静态对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 法兰克机械手手动操作_五轴伺服机械手手动
- 下一篇: 让0球平局怎么算_半场16中5+0助攻+