哇塞!提速72倍,在Python里面调用Golang函数

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析 摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。 阅读详情

点击上方“菜鸟学Python”,选择“星标”公众号

超级无敌干货第一时间推给你!!!

我们知道,在涉及到大量 CPU 计算的时候,Python 的运行效率可能不如其他语言。在之前的一篇文章:一日一技:立竿见影地把你的 Python 代码提速7倍中,我们讲到了如何通过把 Python 代码编译成 C 语言代码来提高代码的运行速度。

今天,我们不用 C 语言,而用 Go 语言。并且,我们这次不是做转换,而是直接用 Python 调用 Go 语言写的代码。

今天我们的测试代码还是递归版本的斐波那契数列计算函数,由于递归版本涉及到大量重复计算,所以运行速度极慢。用 Python 计算第40项,耗时36.6秒,如下图所示:

如果直接使用 Golang 来写相同的算法,速度会远远快于 Python——同样是计算第40项,只需要0.5秒,如下图所示:

那么,我们能不能使用 Golang 写一个计算斐波那契数列的递归函数,但是使用 Python 来调用这个函数呢?

实际上是可以的,我们只需要把 Golang 写的程序编译为.so文件就可以在 Python 里面调用了。

首先修改一下我们的 Golang 代码,把计算斐波拉契数列的函数fib的首字母改成大写。在 Golang 中,只有首字母大写的函数,才能被package外面的代码调用。

修改以后的代码如下:

package main


import (
    "C"
)


//export Fib
func Fib(n int) int {
    if n == 1 || n == 2{
        return 1
    } else {
        return Fib(n - 1) + Fib(n - 2)
    }
}


func main() {}


需要注意的是,这里的注释//export Fib不能省略,因为在编译成.so文件的时候,编译器会寻找这个注释。同时,为了能正常编译,我们也必须导入C这个包。

把代码保存为fib.go,然后我们使用如下命令进行编译:

go build -buildmode=c-shared -o _fib.so fib.go

这条命令指定了编译模式为c-shared,编译完成以后,当前文件夹下面会生成一个_fib.so文件。这就是我们需要用 Python 载入的文件了。

下面,我们创建一个 Python 文件load.py,代码如下:

import ctypes
import time




so = ctypes.cdll.LoadLibrary('./_fib.so')
fib = so.Fib


start = time.time()
result = fib(40)
end = time.time()
print(f'斐波那契数列第40项:{result},耗时:{end - start}')

在这段代码里面,通过 Python 自带的ctypes模块,加载_fib.so文件,然后提取出里面的Fib函数。这个函数就是用递归方式计算斐波那契数列的函数了。同样是计算第40项,我们来看看耗时:

只需要0.5秒。耗时只有纯 Python 版本的 三十六分之一,也就是说,通过 Python 调用 Golang 的函数,速度是纯 Python 版本的72倍。

但需要注意的是,由于Golang 是静态强类型语言,定义函数的时候需要声明变量类型。如果你要导出的函数是字符串,那么变量类型需要改为*C.char而不是简单的string。这里涉及到 C 语言中的变量类型与 Golang 中变量类型的映射关系,可以参阅:cgo[1]。本文的例子中,由于整型比较特殊,直接使用int就可以了。但其他的类型可能并没有这么简单。

参考资料

[1]

cgo:https://golang.org/cmd/cgo/

近期八大热门:

发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片!
盗墓热再起!我爬取了6万条《重启之极海听雷》的评论,发现了这些秘密
用Python一键生成炫酷九宫格图片,火了朋友圈
菜鸟也疯狂!8分钟用Python做一个酷炫的家庭随手记
Github获8300星!用Python开发的一个命令行的网易云音乐
一道Python面试题,硬是没憋出来,最后憋出一身汗!卧槽!Pdf转Word用Python轻松搞定!教你6招,不错的Python代码技巧!
由 菜鸟学Python 原班人马打造的公众号:程序员GitHub,现已正式上线!
接下来我们将会在该公众号上,为大家分享GitHub上优质的开源神器,程序员圈的趣事,坚持每天一篇原创文章的输出,感兴趣的小伙伴可以关注一下哈!

长按 2 秒,输入【福利】

获取程序员必读好书

点这里,领取新手福利
【RH850/U2A】:功能安全 功能安全相关 阅读详情

相关推荐

python和go相互调用的两种方法

将go代码编译成so库 -> python中通过ctypes引用so库并指定需要调用的函数(同时可指定传入参数类型和返回值类型) -> 指定后按python使用函数方式调用。需要注意的是:python和go之间参数传递是需要经过C的数据类型转换的,因此需要了解python中ctypes数据类型和python数据类型以及C的数据类型对应关系ctypes数据类型为指定调用函数时的传入参数和返回值的数据类型python数据类型为调用函数时传入的参数的数据类型。

kuokay的博客 5845

机器人系统能用MQTT5.0代替ROS2吗?

更为灵活和友好的方案是通过把ROS(Robot Operating System)与MQTT(Message Queuing Telemetry Transport)协议相结合的解决方案,利用MQTT的轻量级、跨平台和广泛适用性特点,扩展ROS系统的通信能力,或将非ROS系统接入ROS网络。

QzmAIoT 2164

Golang vs Python:一场高效编程语言对决

Go和Python都是非常流行非常优秀的编程语言,它们在不同的领域有着广泛的应用。Go语言是一种简洁、高效、可靠的编程语言,具有并发编程、高效性能、跨平台和强大的标准库等特点。它在服务器开发、网络编程、云计算和容器技术、分布式系统以及人工智能和机器学习等领域有着广泛的应用。因此,学习Go语言将使你能够快速构建高性能的应用程序,并拥有更多的职业发展机会。

SteveRocket's-Blog 2915

HFSS - 侧馈矩形微带天线设计与仿真

一、设计指标 中心频率:2.45GHz 介质板厚度:1.6mm 介质板相对介电常数:4.4 二、理论计算 辐射贴片宽度w=c2f(εr+12)−12w=\frac{c}{2 f}\left(\frac{\varepsilon_{r}+1}{2}\right)^{-\frac{1}{2}}w=2fc​(2εr​+1​)−21​ 辐射贴片长度L=cfεe−2ΔLL=\frac{c}{f \sqrt{\varepsilon_{\mathrm{e}}}}-2 \Delta LL=fεe​​c​−2ΔL

MaxWei 1万+

目标检测数据集 第059期-基于yolo标注格式的水果李子检测数据集(含免费分享)

李子作为中国三大水果之一,种植历史超 3000 年,在市场中占据重要地位。传统李子种植、施肥、采摘依赖大量人力,存在资源浪费、产量估算不准、采摘时机难把控等问题。此前,农业领域缺乏针对 “未成熟李子” 的专用数据集,现有水果检测数据集多聚焦于成熟果实(如苹果、柑橘),且未覆盖李子种植的复杂自然场景。在使用该数据集进行学术研究时,应遵守相关的学术规范,引用该数据集的来源,尊重数据集创作者的劳动成果。,用于训练改进型模型,解决李子精准检测的核心痛点。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 772

Python与Golang简单了解

python是一种动态的,简单易学的语言 可以开发应用程序,完美的融入了面向对象的语言 然而,网站和软件开发、数据分析和可视化都涉及到 Python 的使用。

2201_75362610的博客 886

将一维数据(序列)转化为二维数据(图像)的方法汇总GAFS, MTF, Recurrence plot,STFT

虽然深度学习方法(1D CNN, RNN, LSTM 等)可以直接处理一维数据,但是当前的深度学习方法主要还是处理二维结构数据的,特别是在计算机视觉CV以及自然语言处理NLP领域,各种各样的方法层出不穷。因此,如果能够将一维序列数据转化为二维(图像)数据, 则可以直接结合CV以及NLP领域的方法,是不是很有趣! GAF, GASF, GADF, MTF, Recurrence Plot, STFT, 短时傅里叶变换

MasterQKK 5万+

python调用golang中函数方法

由于simhash方法有多种实现方式,现python中simhash方法与golang中的不一样,需要两者代码生成结果保持一致,故采用python中的代码调用golang编译的so文件来实现。:①Windows10系统要有gcc环境,否则go build编译so文件不会成功。注意:有的Windows10通过MinGW Installer安装的32位gcc版本,编译会报错。重点说明一下方式二,go代码中涉及第三方依赖包引用,需要对调用的函数加上export注释。" 不是注释,类似java中的注解,

dkgee 1915

全国大学校园网—拓扑图欣赏

全国大学网络拓扑图(一百张) 典型十张 1、 中央财经大学 2、国防科技大学 3、济南大学 4、西安石油大学 5、南通大学IPV6网络 6、中国矿业大学 7、青海师范大学 8、内蒙古科技大学 9、三峡大学 10、中共江苏省党校 剩余90张 点赞、评论获取 ...

LiBai'S BLOG 5万+

Could not create cache adapter cache factory not found: factory for cache adapter ““ was not regist

RROR: Could not create cache adapter error=cache factory not found: factory for cache adapter "" was not registered ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:349: starting co...

知无涯 4034

优雅就对了!Python调用Golang代码的那些细节

Python代码中有一个字符串,例如:item_ids = ["Item1", "Item2", "Item3"],想要传给Golang函数,需要用两个参数,一个是数组的指针,一个是数组的长度,对应的argtypes分别是ctypes.POINTER(ctypes.c_char_p)和ctypes.c_int,可以简单的理解c_char_p就是string类型即可。说完了Python传给Golang,在Golang代码计算好了之后,也需要把结果返回给Python。2023年11月19日 19:18。

具身机器人和通用AI 702

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 844

golang int 转string_哇塞!提速72倍,在Python里面调用Golang函数

我们知道,在涉及到大量 CPU 计算的时候,Python 的运行效率可能不如其他语言。在之前的一篇文章:一日一技:立竿见影地把你的 Python 代码提速7倍中,我们讲到了如何通过把 Python 代码编译成 C 语言代码来提高代码的运行速度。今天,我们不用 C 语言,而用 Go 语言。并且,我们这次不是做转换,而是直接用 Python 调用 Go 语言写的代码。今天我们的测试代码还是递...

weixin_39723655的博客 120

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python与Golang

Go 编程语言是静态强类型的类型的(在编程格式上与Python最大的区别是Go定义变量时必须指定类型,这样就缩减了代码的灵活性)。此外,Go 的语法与 C 的语法相当。此外,它的设计目标是突出性能和快速开发。Go 提供了类型安全、垃圾回收、动态类型以及几种高级的内置类型,例如可变长度数组和键值映射。Python 是一种高端编程语言,本质上是面向对象的。Go 是一种同时开发的过程编程语言。

DTCloud 537

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python 调用golang_python调用golang编写的动态链接库

楔子我们都知道python的效率很低,但是好在可以和C语言无缝结合,C语言写好动态链接库之后再让python去调用简直不要太方便。但是使用C编写动态链接库也不是件容易的事情,于是笔者想到了go,go的效率虽然不如C,但是也没有逊色太多。而且go毕竟是一门高级语言,丰富的标准库、数据类型,编写动态链接库比C方便太多了。下面我们就来看看如何使用golang编写动态链接库交给python调用。另外pyt...

weixin_32431067的博客 1390

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

提速72倍,在Python里面调用Golang函数

摄影:产品经理上海味道不错的川菜文章来源:未闻Code作者:kingname我们知道,在涉及到大量 CPU 计算的时候,Python 的运行效率可能不如其他语言。在之前的一篇文章:一日一...

简说Python的博客 895

python调用golang并回调

最近折腾python交互,也真够呛的,一连玩了好几天,被虐的不要不要的。天天各种百度,Google之间。好吧,废话少说,转入我们的正题。其实,py调用go一般的函数,只是第一道坎,正主其实是py调用go,并且go还回调py!!!网上其实这些问题很少,而且有且只有一篇关于go回调py的。就是如下一位大兄弟写的:https://www.golangtc.com/t/59f858c04ce40d3bf4...

gtd138的博客 6086

对未来的技能,Go和Python哪个更好

Python和Golang都是高级Web语言。有经验的程序员或 Web 开发人员应该选择哪一个?让我们简要看看。

2301_78145669的博客 1042

【Go入门】编程语言比较:Golang VS Python

Asteroid 是该公司的 Wireguard 服务器管理应用程序,是用 Golang 编写的。语法非常简单和干净。布丁的好坏不在于吃,但当全球巨头支持一项技术时,您可以依靠更好的支持、升级和维护。因此,Go 是开发基于云的解决方案的万无一失的语言。然而,它已经超越了这一点,并已成为您可能每天使用的解决方案的一部分。Go 或 Golang 由 Google 于 2007 年设计,与 C 相似,内存安全,具有垃圾收集功能,并且是结构类型的。事实上,它几乎可以执行所有可以想象到的任务,这是它最好的功能之一。

QAQterrible的博客 1458

Golang和Python程序对比之详细贯穿Golang和Python的第一个程序,以及对应的二进制文件编译方法

Python和Golang都是相当不错的编程语言,都值得一窥,所以此处使用两者的第一个程序,将两者的特点进行代码注解详细介绍做记录,当然目前我们的项目上是全栈python,GoLang出于个人喜好自学而已,日后将会在项目中进行GoLang实践。 Windows系统下,我的Golang版本 我的python版本 为什么GoLang值得学习 1、实际需求,对项目中的应用需要进行并

SteveRocket's-Blog 2719

python调用golang的函数

python调用golang python调用golang脚本,中间需要通过cgo进行 golang部分 需要先导入cgo和一些标准库 import ( "fmt" "quote/node_exporter" "unsafe" ) /* #cgo CFLAGS: #include <stdio.h> #include <stdlib.h> */ import "C" //需要紧挨着 暴露一些golang函数 注意: // 和ex

qq_39904356的博客 1999

python 打印耗时_Python+Go——带大家一起另寻途径提高计算性能

/1 前言/ Hello各位小伙伴你们好,我们都知道Python是一个生产力很高的语言,小编本人也非常喜欢Python,经常使用Python帮助小编以最高的效率完成最多的事,但是Python的性能,是我们一直诟病的一个问题,尤其是一个大锁GIL,有时候想想简直像吃了苍蝇一样有点难受。当然了,现在我们大部分程序都是(IO)网络密集型程序,Python足以胜任,但是如果说我们已...

weixin_32644319的博客 450

python与golang对比学习

其中每一个小结基本都会python和golang对比来理解。

qq_46004291的博客 1509

Python和Go语言都这么火,哪个更适合你?

Go 和 Python 都易于使用和学习。Go 真的很快。Python 有大量的社区支持。目前,在 Go 的开发中,Go 主要用于服务器端应用程序。Python 是数据科学家的首选语言,而且很可能会持续很长时间。所有 ML 库开发人员都在投入时间为 Python 开发库。Go 可能会及时到达那里,但就目前而言,程序员的工具包中有两种语言的空间。TSINGSEE 青犀视频研发人员在做平台开发时,在智能分析方面用 Python 编译会比较多,在部分基层调用能力上则采用 Golang 比较多。

m0_59236127的博客 2376

python和golang调用_golang调用python实战

简介: # 简介 ## go-python Python提供了丰富的[C-API](https://docs.python.org/2/c-a...。而C和Go又可以通过cgo无缝集成。所以,直接通过Golang调用libpython,就可以实现Go调Python的功能了。但是过程比较复杂,而[go-python](https://github.com/sbinet/go-...简介go-pyth...

weixin_31960145的博客 848
上一篇: 微软和NASA强强联手,重磅推出Python免费课程
下一篇: 微信群总是有人发广告?我用Python写个机器人消灭他!
菜鸟学Python
博客等级 码龄9年 8075粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值