package main

import "C"

//指定那些函数能被外部调用

//export test

func test()  int{

//计算 0-1000000000 的和

var s int

for a := 0; a <= 10000000000; a++ {

s += a

}

return s

}

​//pxport addstr

func addstr(a,b * C.char) *C.char{

merge := C.GoString(a) + C.GoString(b)

return C.CString(merge)

}

func main(){

}

编译生成动态链接库,生成的.so文件可以被python加载并调用

但是有一个需要注意的地方:

Python是利用ctypes来跟so模块进行交互,其中存在着一个代码的翻译过程,包括数据类型的翻译,如果需要传参获取接收返回值,需要在golang中将参数按照下表对应,定义成C语言的数据类型。

这里列举几个常用的数据类型

go文件编译成动态链接库

go build -buildmode=c-shared -o learn.so learn.go

from ctypes import CDLL

add = CDLL('./test.so').addstr #调用go模块

# 显式声明参数和返回的期望类型

add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]

add.restype = ctypes.c_char_p

print(add('test','test'))

# 无参数,则可直接调用

t = CDLL('./test.so').test     #调用go模块

print(t())

python 中调用go模块,并统计两个模块循环10亿次累加的时间,查看go跟python执行效率

# coding=utf-8

import time

from ctypes import CDLL

import ctypes

def xu():

# python 计算累加

sum = 0

for i in range(0,1000000000+1):

sum += i

return sum

if __name__ =="__main__":

add = CDLL('./test.so').addstr #调用go模块addstr方法

# 显式声明参数和返回的期望类型

add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]

add.restype = ctypes.c_char_p

print(add('haha','hehe'))

# go 10亿次累加

start = time.time()

t = CDLL('./test.so').test #调用go模块test方法

t.restype = ctypes.c_int64 # 返回int64类型

print("go执行结果:%s"%t())

end = time.time()

print("go :1000000000 累加耗时 %.2f" %(end-start))

# python累加10亿次

start = time.time()

print("python执行结果:%s"%xu())

end = time.time()

print("python :1000000000 累加耗时 %.2f" %(end-start))

运行结果: 运行速度差近200倍!

golang python性能_Golang构建Python高性能模块相关推荐

  1. go语言调用python脚本_Golang调用Python

    Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅 ...

  2. 基于 Python 官方 GitHub 构建 Python 文档

    1. 下载 Python 的 GitHub 仓库:cpython 从 GitHub 上 clone 仓库很简单,在命令行中执行命令 git clone git@github.com:python/cp ...

  3. Matlab 生成 Python 包并构建 Python 应用程序

    支持:Windows®, Linux®, Mac 如何从 MATLAB® 函数创建 Python® 包并将生成的包集成到 Python 应用程序中. 1.确认安装了与 MATLAB Compiler ...

  4. python golang相互调用_golang和python互相调用

    2018 June 27 go, golang, python golang和python互相调用 网站 综述 golang和python之间,当前可以通过golang的cgo和python的ctyp ...

  5. 哪些模块可用于python性能分析_Python调用C模块以及性能分析

    一.c,ctypes和python的数据类型的对应关系 ctypes type ctype Python type c_char char 1-character string c_wchar wch ...

  6. go与python区别_golang和python有什么区别?

    golang和python有什么区别?下面本篇文章给大家对比一下Python和Golang,介绍一下golang和python的区别.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. ...

  7. Python性能分析,Python可是无所不能的!

    当我们开始精通编程语言时,我们不仅希望实现最终目标,而且希望使我们的程序高效. 在这个教程中,我们将学习一些Ipython的命令,这些命令可以帮助我们对Python代码进行时间分析. 注意,在本教程中 ...

  8. kafka python 性能_使用 Python 监控 Kafka Consumer LAG

    我在要完成这个需求的时候大概有两个思路. 第一种方法: 我们直接使用 Kafka 提供的 bin 工具,去把我们关心的 lag 值 show 出来然后通过代码处理一下报出来.例如: 我们可以起个远程的 ...

  9. Python性能优化

    http://blog.csdn.net/pipisorry/article/details/39998317 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 perfo ...

最新文章

  1. 使用Valgrind的callgrind做c/c++代码的code profiling/性能调优
  2. “勒索病毒”为什么盯上了比特币?
  3. iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
  4. 详细介绍 Qt Creator 快捷捷应用
  5. Angular学习笔记第一节 基本概念
  6. flask的请求与响应
  7. python3.7打包exe后有显示no utf-8_pyinstaller 打包生成exe之后运行提示‘no module name 'xxx'’错误...
  8. Android世界第一个activity启动过程
  9. 如何管理和组织一个机器学习项目
  10. java获取oracle自增_java相关:MyBatis Oracle 自增序列的实现方法
  11. python 入侵服务器_一个入侵iis服务器的简单案例
  12. 友情链接对于网站来说有什么作用?
  13. Android源码解析系列
  14. SOCOFing指纹数据集
  15. 思科 接入点 本地转发_H3C无线AP本地转发配置教程2016
  16. 云计算大数据中心(清明作业)
  17. Chrome渲染分析之Rendering工具使用
  18. 结对编程项目——最长英语单词链
  19. termux是等于linux终端,termux终端
  20. 军备竞赛!奔驰全球“扩招”3000名软件工程师,2024年推MB.OS

热门文章

  1. JS浮点数运算Bug的解决办法(转自百度文库)
  2. 数学基础学习随笔--序言
  3. HTML如何在按钮右侧显示div,如何实现点击页面中的一个按钮相应位置的div显示隐藏?...
  4. linux获取互联网时间,linux中用shell获取时间,日期
  5. unity 弹出式菜单_Java Swing JMenu和JPopupMenu:菜单和弹出式菜单
  6. 科普 | 12个关键词,告诉你到底什么是机器学习
  7. Cpp拾零(to be continued)
  8. 计算机无法识别华为m3,华为8寸M3(非青春版)电脑连接问题报告
  9. 【RFID】基于MATLAB的RFID 系统的空中接口过程以及防碰撞算法仿真
  10. Windows Server 2008 R2 如何启用WINS服务