欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python靜態(tài)庫(kù)c函數(shù) python c庫(kù)

怎樣把Python代碼嵌入到C程序

這篇文章主要介紹了將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例,盡管通常還是Python代碼中調(diào)用C++程序的情況較多...需要的朋友可以參考下

站在用戶的角度思考問題,與客戶深入溝通,找到鉛山網(wǎng)站設(shè)計(jì)與鉛山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鉛山地區(qū)。

把python嵌入的C++里面需要做一些步驟

安裝python程序,這樣才能使用python的頭文件和庫(kù)

在我們寫的源文件中增加“Python.h”頭文件,并且鏈入“python**.lib”庫(kù)(還沒搞清楚這個(gè)庫(kù)時(shí)靜態(tài)庫(kù)還是導(dǎo)出庫(kù),需要搞清楚)

掌握和了解一些python的C語(yǔ)言api,以便在我們的c++程序中使用

常用的一些C API函數(shù)

在了解下面的函數(shù)之前有必要了解一下**PyObject***指針,python里面幾乎所有的對(duì)象都是使用這個(gè)指針來指示的。

Py_Initialize()Py_Finalize()

在調(diào)用任何python的c函數(shù)之前需要調(diào)用的函數(shù),“Py_Initialize”是用來初始化python模塊的,推測(cè)是加載初始化加載dll的。對(duì)應(yīng)的在使用python模塊之后用“Py_Finalize”來釋放模塊。

PyImport_ImportModule()

用來載入一個(gè)python模塊,這個(gè)模塊就是一般的python文件。這里需要注意的是,在加載這個(gè)模塊的時(shí)候會(huì)執(zhí)行模塊里面所有可以執(zhí)行的語(yǔ)句。包括import導(dǎo)入語(yǔ)句和在函數(shù)體之外的所有語(yǔ)句

PyObject_GetAttrString()

返回模塊里面的函數(shù)

Py_BuildValue()

建立一個(gè)參數(shù)元組,一般都是用這個(gè)函數(shù)來建立元組,然后將這個(gè)元組作為參數(shù)傳遞給python里面的函數(shù)。

PyEval_CallObject()

調(diào)用函數(shù),并把“Py_BuildValue”建立的元組作為參數(shù)傳遞給被調(diào)用的函數(shù)

源碼實(shí)例

下面的實(shí)例是在c++代碼中調(diào)用Python的函數(shù),傳遞參數(shù)并且獲取返回值

test.cpp代碼

[cpp]?view plain?copy

#include?iostream

#include?Python.h

using?namespace?std;

int?main(int?argc,?char*?argv[])

{

Py_Initialize();??//初始化

PyObject*?pModule?=?NULL;

PyObject*?pFunc?=?NULL;

PyObject*?pParam?=?NULL;

PyObject*?pResult?=?NULL;

const?char*?pBuffer?=?NULL;

int?iBufferSize?=?0;

pModule?=?PyImport_ImportModule(“test_python");

if?(!pModule)

{

cout??"get?module?failed!"??endl;

exit?(0);

}

pFunc?=?PyObject_GetAttrString(pModule,?"main");

if?(!pFunc)

{

cout??"get?func?failed!"??endl;

cout??int(pFunc)??endl;

exit?(0);

}

pParam?=?Py_BuildValue("(s)",?"HEHEHE");

pResult?=?PyEval_CallObject(pFunc,pParam);

if(pResult)

{

if(PyArg_Parse(pResult,?"(si)",?pBuffer,?iBufferSize))

{

cout??pBuffer??endl;

cout??iBufferSize??endl;

}

}

Py_DECREF(pParam);

Py_DECREF(pFunc);

Py_Finalize();

//cout??"hello"??endl;

return?0;

}

test_python.py代碼

[py]?view plain?copy

def?main(szString):

return?("hello",?5)

python能做什么

python的用途:

Python的優(yōu)勢(shì)有必要作為第一步去了解,Python作為面向?qū)ο蟮哪_本語(yǔ)言,優(yōu)勢(shì)就是數(shù)據(jù)處理和挖掘,這也注定了它和AI、互聯(lián)網(wǎng)技術(shù)的緊密聯(lián)系。

網(wǎng)絡(luò)爬蟲。顧名思義,從互聯(lián)網(wǎng)上爬取信息的腳本,主要由urllib、requests等庫(kù)編寫,實(shí)用性很強(qiáng),小編就曾寫過爬取5w數(shù)據(jù)量的爬蟲。在大數(shù)據(jù)風(fēng)靡的時(shí)代,爬蟲絕對(duì)是新秀。

人工智能。AI使Python一戰(zhàn)成名,AI的實(shí)現(xiàn)可以通過tensorflow庫(kù)。神經(jīng)網(wǎng)絡(luò)的核心在于激活函數(shù)、損失函數(shù)和數(shù)據(jù),數(shù)據(jù)可以通過爬蟲獲得。訓(xùn)練時(shí)大量的數(shù)據(jù)運(yùn)算又是Python的show time。

擴(kuò)展資料:

Python開發(fā)人員盡量避開不成熟或者不重要的優(yōu)化。一些針對(duì)非重要部位的加快運(yùn)行速度的補(bǔ)丁通常不會(huì)被合并到Python內(nèi)。在某些對(duì)運(yùn)行速度要求很高的情況,Python設(shè)計(jì)師傾向于使用JIT技術(shù),或者用使用C/C++語(yǔ)言改寫這部分程序。可用的JIT技術(shù)是PyPy。

Python是完全面向?qū)ο蟮恼Z(yǔ)言。函數(shù)、模塊、數(shù)字、字符串都是對(duì)象。并且完全支持繼承、重載、派生、多繼承,有益于增強(qiáng)源代碼的復(fù)用性。

Python支持重載運(yùn)算符和動(dòng)態(tài)類型。相對(duì)于Lisp這種傳統(tǒng)的函數(shù)式編程語(yǔ)言,Python對(duì)函數(shù)式設(shè)計(jì)只提供了有限的支持。有兩個(gè)標(biāo)準(zhǔn)庫(kù)(functools, itertools)提供了Haskell和Standard ML中久經(jīng)考驗(yàn)的函數(shù)式程序設(shè)計(jì)工具。

參考資料來源:百度百科-Python

為什么python內(nèi)置的sort比自己寫的快速排序快100倍?

主要原因,內(nèi)置函數(shù)用C寫的。在Python語(yǔ)言內(nèi)無(wú)論如何造不出內(nèi)置函數(shù)的輪子。這也是通常C跟C++語(yǔ)言用戶更喜歡造基礎(chǔ)算法的輪了的原因。因?yàn)镃/C++用戶真有條件寫出匹敵標(biāo)準(zhǔn)庫(kù)的算法,但很多高級(jí)語(yǔ)言不行,不是程序員技術(shù)差,是客觀條件就根本做不到。

你比如說Java語(yǔ)言沒人造字符串的輪子,C++光一個(gè)字符串類就有無(wú)數(shù)多的實(shí)現(xiàn)。是因?yàn)镃+用戶更喜歡寫字符串類嗎?顯然不是,一方面是因?yàn)镴ava語(yǔ)言內(nèi)沒法造出匹敵Java內(nèi)置標(biāo)準(zhǔn)庫(kù)算法的輪子,而C++真的可以,另外一個(gè)比較慘的原因是C++標(biāo)準(zhǔn)庫(kù)的字符串功能太弱了,大多數(shù)高級(jí)語(yǔ)言的字符串類功能都比C+標(biāo)準(zhǔn)庫(kù)字符串類功能更強(qiáng)。

寫C++的時(shí)候一大錯(cuò)覺就是我覺著我能比標(biāo)準(zhǔn)庫(kù)還快,同樣的道理放在Python里面也同樣適用,不管是Python各種常用package或內(nèi)建函數(shù),基本上都針對(duì)實(shí)用場(chǎng)景作了優(yōu)化,自己手寫的算法一般是比不上內(nèi)建算法效率的,這也是為什么用Python時(shí)不鼓勵(lì)自己造輪子的原因。

回到這個(gè)問題,Python內(nèi)建的sort本質(zhì)上為C實(shí)現(xiàn)的函數(shù),本身執(zhí)行效率就會(huì)比Python快很多,并且會(huì)根據(jù)不同的數(shù)據(jù)規(guī)模采用不同的排序算法,故效率一般都會(huì)優(yōu)于自己在Python里面手寫的排序更何況題主寫的是基于遞歸的quicksort9,額外時(shí)間開銷大。

因?yàn)閜ython內(nèi)置的sort是用c語(yǔ)言寫的,如果你用c語(yǔ)言或者c++寫的話肯定是可以做到一樣快的至于為什么python計(jì)算效率比c語(yǔ)言能慢100倍這個(gè)具體的原理我不清楚,不過鑒于知乎上已經(jīng)有很多大佬解釋過這個(gè)問題,我就不在這里班門弄斧了

還有底下扯timsort的,快排序是所有比較排序算法里平均性能最優(yōu)的一族算法,像C++和rust里的unstable_sort都是用的快排序。可能在一些情況下,比如數(shù)組幾乎有序時(shí),timsort會(huì)比快排序快。但是你隨便給一個(gè)數(shù)組,比如像題主那樣隨機(jī)一個(gè)一百萬(wàn)大小的數(shù)然后排序,timsort是絕對(duì)不可能比快排序快的。絕對(duì)不可能。快的這100倍和timsort屁關(guān)系都沒有。

我是C/C++程序員,我可以很負(fù)責(zé)的告訴你,在用天下現(xiàn)有所有高級(jí)語(yǔ)言進(jìn)行排序的問題上,C要是認(rèn)了第二,則沒人敢認(rèn)第一。所以,我猜,Python以及好多其他高級(jí)語(yǔ)言,都會(huì)時(shí)不時(shí)直接上C語(yǔ)言寫的靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。我自己也造了不少輪子,有部分是因?yàn)閯倓偲鸩剑瑢?duì)系統(tǒng)API和函數(shù)庫(kù)不熟悉,找不到適合的,所以自己造輪子,后來發(fā)現(xiàn)了有更好的,我把我寫的拋棄了。但這里也不排除有一部分是因?yàn)槲覀€(gè)人覺得還有優(yōu)化的空間,所以自己用C語(yǔ)言重新造了一個(gè)輪子,這樣效率比現(xiàn)成的更優(yōu)。

所以說,要論高級(jí)語(yǔ)言的鼻祖,還真非C莫屬,從執(zhí)行效率上講,別說python,JAVA,C#,VB,甚至C的親兒子C++,在同一個(gè)程序員手中,都沒法與C抗衡,所以說,這些語(yǔ)言都是排著隊(duì)等著被C吊打的,也正因?yàn)槿绱耍裕駊ython這類高級(jí)語(yǔ)言,有自帶函數(shù)可用的,最好別想著自己重新造輪子,因?yàn)槟悴豢赡茉斐霰茸詭Ш瘮?shù)更快的輪子。

內(nèi)置庫(kù)函數(shù)都是用C實(shí)現(xiàn)的,肯定要比手寫的Python程序執(zhí)行效率更高,此外內(nèi)置排序Timsort相比本科課程上學(xué)的時(shí)間復(fù)雜度為Onlogn的排序算法做了很多常數(shù)優(yōu)化,所以對(duì)于普通人而言,不要希望純手寫出來的東西效率能和標(biāo)準(zhǔn)庫(kù)相當(dāng)了。另外,題主寫的排序是過不了LeetCode上的裸排序題目的,隨機(jī)選取pivot對(duì)于快速排序是最基本的優(yōu)化雖然題主排的是隨機(jī)數(shù),現(xiàn)在這么選肯定不是效率低的主要原因。

所以說了,py幾乎得把自己的循環(huán)體拆了,這就是py和c/c++的性能差距,必須盡量用內(nèi)置函數(shù)和numpy來處理數(shù)據(jù),一旦手寫循環(huán)體。,那你就得知道這可能得慢百倍,像用opency的py版時(shí)你不小心寫個(gè)雙循環(huán)來處理數(shù)據(jù),那酸爽,而cppc#搞opencv就能隨意用指針來寫循環(huán),這也是為啥他們其實(shí)不需要numpy這種組件,自身就有足夠的性能和靈活度來處理這個(gè)。

Cpp內(nèi)置的排序是快排和堆排的結(jié)合,最壞時(shí)間復(fù)雜度為nlogn,而快排最壞是n2。至于python內(nèi)部的排序,我認(rèn)為是一個(gè)道理,不會(huì)簡(jiǎn)簡(jiǎn)單單是一個(gè)快排,舉個(gè)簡(jiǎn)單例子,當(dāng)你數(shù)據(jù)已經(jīng)是有序的時(shí)候,再傳入快排肯定就不合適。那你設(shè)置排序函數(shù)的時(shí)候,是不是預(yù)先將他打亂,再進(jìn)行快排會(huì)更好呢。當(dāng)然具體不會(huì)這么簡(jiǎn)單,只是我認(rèn)為官方給的接口都是很精妙的,很值得學(xué)習(xí)。

一方面Python中sort函數(shù)是用C語(yǔ)言寫的,C++內(nèi)部的sort是由快排,直接插入和堆排序混合的,當(dāng)數(shù)據(jù)量比較大的時(shí)候先用的快排,當(dāng)數(shù)據(jù)量小的時(shí)候用直接插入,因?yàn)楫?dāng)數(shù)據(jù)量變小時(shí),快排中的每個(gè)部分基本有序,接近直接插入的最好情況的時(shí)間復(fù)雜度O(n),就比快排要好一點(diǎn)了。

另外一方面這個(gè)的底層實(shí)現(xiàn)就是歸并排序。,只是使用了Python無(wú)法編寫的底層實(shí)現(xiàn),從而避免了Python本身附加的大量開銷,速度比我們自己寫的歸并排序要快很多,所以說我們一般排序都盡量使用sorted和sort。

用python怎樣調(diào)用靜態(tài)庫(kù)里的c函數(shù)

將event.py目錄加入到system path中

1

2

3

import sys

sys.path.append("/Users/songrao/Library/Application Support/Sublime Text 3/Packages/User/")

from event import printme

python調(diào)用c函數(shù)

Python是解釋性語(yǔ)言, 底層就是用c實(shí)現(xiàn)的, 所以用python調(diào)用C是很容易的, 下面就總結(jié)一下各種調(diào)用的方法, 給出例子, 所有例子都在ubuntu9.10, python2.6下試過

1. Python 調(diào)用 C (base)

想在python中調(diào)用c函數(shù), 如這兒的fact

#include Python.h

int fact(int n)

{

if (n = 1)

return 1;

else

return n * fact(n - 1);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.c, 編成so庫(kù),

gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫(kù)的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

2. Python 調(diào)用 C++ (base)

在python中調(diào)用C++類成員函數(shù), 如下調(diào)用TestFact類中的fact函數(shù),

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

int fact(int n)

{

TestFact t;

return t.fact(n);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

extern "C" //不加會(huì)導(dǎo)致找不到initexample

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.cpp, 編成so庫(kù),

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫(kù)的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

3. Python 調(diào)用 C++ (Boost.Python)

Boost庫(kù)是非常強(qiáng)大的庫(kù), 其中的python庫(kù)可以用來封裝c++被python調(diào)用, 功能比較強(qiáng)大, 不但可以封裝函數(shù)還能封裝類, 類成員.

首先在ubuntu下安裝boost.python, apt-get install libboost-python-dev

#include boost/python.hpp

char const* greet()

{

return "hello, world";

}

BOOST_PYTHON_MODULE(hello)

{

using namespace boost::python;

def("greet", greet);

}

把代碼存為hello.cpp, 編譯成so庫(kù)

g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1

此處python路徑設(shè)為你的python路徑, 并且必須加-lboost_python-gcc42-mt-1_34_1, 這個(gè)庫(kù)名不一定是這個(gè), 去/user/lib查

然后在有此so庫(kù)的目錄, 進(jìn)入python, 可以如下使用

import hello

hello.greet()

'hello, world'

4. python 調(diào)用 c++ (ctypes)

ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.

ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

extern "C"

int fact(int n)

{

TestFact t;

return t.fact(n);

}

將代碼存為wrapper.cpp不用寫python接口封裝, 直接編譯成so庫(kù),

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

進(jìn)入python, 可以如下使用

import ctypes

pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')

pdll.fact(4)

12

python使用ctypes調(diào)用C編譯dll函數(shù)方法

在函數(shù)聲明加入前綴,如

__declspec(dllexport) int Fun(int a, int b)

否則在加載該dll時(shí)會(huì)提示找不到該符號(hào)

在windows下可以通過vs自帶的dumpbin工具查看可被調(diào)用符號(hào)

dumpbin /exports test.dll

C函數(shù)在調(diào)用過程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時(shí),必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會(huì)導(dǎo)致棧破壞,編譯器負(fù)責(zé)具體實(shí)現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定

python下調(diào)用C庫(kù)有多種方式,ctypes是其中一種比較方便的,調(diào)用時(shí)首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫(kù)

對(duì)于簡(jiǎn)單的C函數(shù),例如 int add(int a, int b) , 此時(shí)就可以直接調(diào)用了,如

對(duì)于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時(shí)對(duì)入?yún)⒑统霾妥鲆欢ㄌ幚恚@里分情況討論

以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個(gè)較為完整的python類型和C類型的對(duì)照,如下:

網(wǎng)站題目:python靜態(tài)庫(kù)c函數(shù) python c庫(kù)
URL標(biāo)題:http://chinadenli.net/article20/dodhgjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)全網(wǎng)營(yíng)銷推廣服務(wù)器托管網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站制作App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司