python中嵌入C语言脚本.docx
- 文档编号:3793599
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:7
- 大小:25.56KB
python中嵌入C语言脚本.docx
《python中嵌入C语言脚本.docx》由会员分享,可在线阅读,更多相关《python中嵌入C语言脚本.docx(7页珍藏版)》请在冰豆网上搜索。
python中嵌入C语言脚本
python中嵌入C语言脚本
python中嵌入C语言脚本
借助Cinpy和C语言解释器TinyCC,可以在python程序里面直接嵌入C语言片断、不经编译直接使用C编写的函数了。
win2k平台上,简单的测试对比数据如下(递归方法计算第四十项兔子数列fib(40))语言
实现
时间
(单位:
秒)
评
python
官方python2.4.3
纯pythonfib函数
568.718
天啊
使用psyco加速的pythonfib函数
17.922
6.719
解释执行
6.813
FreeBASIC
fbc0.16b
编译的可执行文件(-arch486)
8.022
编译的可执行文件(-arch686)
7.619
forth
4th3.5a2
4thcxfib.4th
277
这个表现太失望了
4thcsvfib.4thfib.hx
4thlxfib.hx
196
4thlgfib.hxfib.c
mingw-O2fib.c-ofib.exe
110
gforth-0.6.2
Gforth-fastfib.gfth
14.719
不错,不过不是说和C的速度可以比嘛?
怎么也就是优化的python的速度啊
注:
其余源程序
freebasicfunctionfib(xasinteger)asinteger
ifx<=1then
return1
else
returnfib(x-1)+fib(x-2)
endif
endfunctiondimstarttime,endtimeasdouble
dimresasintegerstarttime=timer
res=fib(40)
endtime=timer
print"fib(40)=";res
print"timeelapsed:
";(endtime-starttime);"s"
4th :
fib(x--y)
dup2>if
dup1-recurse
swap2-recurse+
exit
then
drop1;time41fib.crtime
swap-
."timeelapsed".."s"cr
gforth-0.6.2:
fib(x--y)
dup2>if
dup1-recurse
swap2-recurse+
exit
then
drop1;
utime41fib.crutime
2swapd-
."timeelapsed"d.."us"cr
如果在windows下使用mingw编译当前的TinyCC,嵌入C脚本会报错:
tcc:
file'/c/ProgramFiles/tcc/libtcc1.a'notfound
DougCurrie在tcc的邮件列表里面提供了一个补丁:
HereiswhatIdid(andreportedtothemailinglist)lastFebruary,
sothepatchmaynotbeaccurateformorerecentversions,butthe
issuesarethesame...
Ihavebeenabletocreatealibtcc.dllforWinXPusingMinGW/MSYS;
thechangesthatwerenecessarywereveryminor.Perhapsthis
descriptionwillhelpothersuselibtcconWindows.
First,asmallbugtoreport:
Intcc.cthefunctiontcc_basename()followstheline:
#if!
defined(LIBTCC)
butthefunctiontcc_basename()isusedinpe_build_exports()in
tccpe.c--movingthe#iflinebelowthefunctiontcc_basename()
eliminatesalinkerrorbuildinglibtcc.dllinPEtargetmode.
Second,configuringandmakingtccwithMSYSplacesapathnamein
config.hinMSYSformat.Forexample,Ipassedtheargument
--prefix=/c/Dev/tcc
toconfigure;thispathwasgoodforbuildingtcc.exeanddidn't
containanyspaces,unlikethedefaultpath.Thiscreatestheline
#defineCONFIG_TCCDIR"/c/Dev/tcc"
inconfig.h.Manuallychangingthislineto
#defineCONFIG_TCCDIR"C:
/Dev/tcc"
enableslibtcc.dlltofindtheincludefilesandlibrariesoncethe
libraryisbuilt.[Theapplicationtcc.exeavoidsthisproblemby
settingtcc_lib_pathfromtheapplication'sdirectoryatstartup.A
similarsolutioncouldbeusedforthelibraryusingDllMain.]
So,afterconfigure,fixCONFIG_TCCDIRinconfig.handmake.
Finally,thelibrarylibtcc.dllcanbebuiltwiththeMSYScommand:
gcc-O2-shared-Wall-Wl,--export-all-symbols/
-mpreferred-stack-boundary=2/
-march=i386-falign-functions=0-fno-strict-aliasing/
-DTCC_TARGET_PE-DLIBTCC-olibtcc.dlltcc.c
Belowisadiffoftcc-0.9.23tcc.candthechangesforLIBTCCwith
TCC_TARGET_PEandDLLlocationoflibraryfiles.
Regards,
e
$diff-u../tcc-0.9.23-o/tcc.ctcc.c
---../tcc-0.9.23-o/tcc.cFriJun1718:
09:
152005
+++tcc.cTueFeb2817:
03:
442006
@@-10157,8+10157,6@@
flag_name,value);
}
-#if!
defined(LIBTCC)
-
/*extractthebasenameofafile*/
staticconstchar*tcc_basename(constchar*name)
{
@@-10175,6+10173,35@@
returnp;
}
+#ifdefined(LIBTCC)
+
+#ifdefWIN32
+int__stdcallDllMain(void*hinstDLL,unsignedlongfdwReason,void*
lpvReserved)
+{
+if(fdwReason==1/*DLL_PROCESS_ATTACH*/)
+{
+/*onwin32,asimplementedinmain()
+wesupposethelibandincludesareatthelocationofthislibrary
+*/
+staticcharpath[1024];
+char*p,*d;
+
+GetModuleFileNameA(hinstDLL,path,sizeofpath);
+p=d=strlwr(path);
+while(*d)
+{
+if(*d=='//')*d='/',p=d;
+++d;
+}
+*p='/0';
+tcc_lib_path=path;
+}
+return1/*TRUE*/;
+}
+#endif
+
+#else/*!
LIBTCC*/
staticint64_tgetclock_us(void)
{
#ifdefWIN32
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python 嵌入 语言 脚本