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