计算机视觉专家:如何从C++转Python

news2024/9/30 15:18:25

有人说用 Python 编程很简单,6 岁小孩都能学会。计算机视觉专家和编程语言爱好者 asya f 刚开始上手 Python 时也这么想。但门槛低就仅意味着使用简单吗?经常调用 API 的人是不是一定比可以从零写出源码的人菜?在本文中,asya f 告诉我们,从 C++转向 Python,是一次「从个人到社区」的思维转变。

转载自丨机器之心

从 C++ 转 Python 的时候,我已经是一个有四年全职工作经验的软件开发者了。我的工作主要是用 C++在 Linux 上编程,是 QT 库的重度用户。但刚开始用 Python 的时候,我却写得很烂。

从 C++到 Python 的过渡已经有了大约三年时间,我觉得是时候总结一下这段时间的经历了。回想起来,我改变的不只是自己所用的编程语言,还有工作方式和我对代码的看法。

C++和 Python 的区别此处不做赘述,网上可以找到很多相关信息。此处只讲述我的个人经历。

从 C++跳到 Python(图源:Unsplash ;上传者:Erik Dungan )

C++是跳水,Python 是潜水

C++给人的感觉就像是一头扎进奇幻神秘的大海里——它是如此美妙,但需要更多学习和训练。总的来看,你游过的水面不会很大。而 Python 有点像潜水——把头伸进水里就能看到它的美,但你不会太深入,而是在浅水里游啊游,可以轻易地游过很大一片地方。两种语言如此不同,所以适用的场景也不同。

深入 C++并努力成为幸存者

C++更为严格,在你犯错的时候会更加严厉地惩罚你。一次都没有收到过 Segmentation fault 的编码会话算不上有效的编码会话。因此,你需要更加了解计算机、编译器和语言。如果深入下去,你会被其中蕴含的美所打动,如编译过程和内存管理。

作为一名 C++ 程序员,我更关心句法调整和奇怪的例子。我一直知道我是怎么分配、释放内存的。我写的程序更加独立,因为我更想知道自己的代码内部究竟发生了什么。我主要是觉得其他人编写的代码不太可靠,更容易出错,并且可能会增加内存使用量。

Vim、GDB 和 Valgrind 是我用到的主要日常工具*。*Vim 有很多用于编写代码的插件,GDB 用于 debug,Valgrind 用于分析我的内存占用和错误。我用 g++编译,自己写 Makefiles。那时候,我觉得 IDE 没什么用,还会拖慢速度,让我失去接触代码的机会。回想起来,我非常依赖编译器来查找类型错误。

图源:Unsplash;上传者:Jakob Boman

浅尝 Python

转向 Python 时,你需要学习的第一件事情就是如何放手:你不知道代码的底层到底发生了什么,内存被分配到哪里、释放到哪里,但没关系。你也会被鼓励使用其他人写的封装为库的代码,这能帮助你节省时间,提高编码速度。这并不意味着你需要写慢如蜗牛并依赖于无维护和无功能的库的代码,其中的关键是很不同的。

刚开始用 Python 写代码时,我用 Python 写 C++。这也行得通,但我并没有从这门语言中获得任何收益。当我开始以更加 Python 式的风格来写代码并使用库以及更多高级概念(如 generators、decorators 和 contexts)时,我的编程技巧才得到提升。

作为一个 Python 开发者,我倾向于首先寻找能解决眼前问题的库。Python 拥有丰富的库生态系统和社区的支持。有很多具有专门用途的库。这些是我经常会用到的库:NumPy(数值计算)、OpenCV(计算机视觉)、json(阅读 json 文件)、SciPy(科学计算)、sqlite3(数据库)。

我每天使用的工具是带有 IdeaVim 插件的 PyCharm(这是一个 IDE)。我开始用这个工具是因为它是一个很强大的调试器,比默认的 Python 调试器 pdb 更加友好。我还使用了 pip 来安装需要的库。除非必要,我一般都不再监控内存使用了。

图源:Unsplash ;上传者:Channey

一些实用技巧

如果你是一个 C++开发者,并且考虑开始写 Python,以下是我的一些建议:

  • 改掉老习惯:别再使用 C++编译器作为调试器。不用再过度优化内存使用。避免写出 C++风格的代码。并且无论如何,不要再依赖类型。

  • 养成新习惯:开始使用库。写 Python 式的代码(但不要为了写而写),保证代码的可读性。尝试使用一些更加复杂的概念,如 generators、decorators、contexts。尝试 PyCharm。

  • 使用 C++和 Python 共用库:一些 C++库(如 OpenCV、QT)有 Python 接口。在 Python 中使用相同的库会比从零开始学习一个新库更加容易。

  • 勿忘初心:有时候 Python 实在是太慢或者不适合你的任务,C++经验就派上用场了。有很多方式(SIP、ctypes 等)可以让你在 Python 内使用 C++代码。

结语

无论其他人说什么,切换到另一种编程语言都不容易,尤其是切换到一种与你用过的语言完全不同的语言。你要花时间去学习、挖掘、发现。但最重要的是,你要改变的不仅仅是语言,还有编码风格和工作方法。 

-(完)-


—THE END—

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据生产流程——采集、清洗、分析

大家好,这里是小安说网控。 前几篇文章,我们分享了线上价格监测的重要性以及注意事项。数据监测是如何将平台上海量的数据转换为有价值的营销情报的呢?今天,我们来一个数据生产流程大揭秘! 一、 数据采集 数据采集就是…

2022腾讯数字生态大会:腾讯云HiFlow,零代码自动化工作流助手

2022腾讯数字生态大会,在主题为“数字化叠变、全域新协作”的腾讯云SaaS连接专场上,多款产品重磅发布。 未来企业数字化转型的越来越多的使用saas是一个趋势,那么如何解决SaaS之间的互联互通和数据孤岛?腾讯云HiFlow的业务负责人…

嵌入式通用const和volatile和static inline关键字 (volatile寄存器地址修饰必不可少)

const和volatile之间的合作【1】const修饰变量【2】const修饰数组【3】const修饰指针【4】const修饰函数【5】volatile的应用【6】volatile详解【7】const和volatile配合【8】AHB (高级高性能总线)【9】APB (高级外围总线)在学习ADC之前掌握这些 #define __IO volatile …

iPayLinks艾贝盈上线委托换汇功能!

“8.11”汇改以来,人民币汇率市场化形成机制逐步完善,人民币汇率弹性不断增强,双向波动成为常态。 在市场化的汇率形成机制下,外贸人想要快、准、稳地选到合适汇率,降低汇损提高利润,仅靠自己难以实现。 …

模拟电路设计(36)---谐振型变换器

谐振型变换器 今天来介绍下谐振型变换器。脉宽调制型通过控制开关管的导通占空比来调节输出电源功率,而谐振型变换器以正弦形式处理功率开关管,使得开关管在零电流或者在零电压的情况下实现导通和关闭,从而降低开关功耗,提高变换…

这才是数字孪生污水处理厂该有的样子 | 智慧水务

近年来,智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域,如何贯彻落实双碳战略,积极推进智慧水厂建设,显得尤为关键。 图扑软件依托自主研发的 HT for Web 产品,并结合视频融合、BIM、5G、物联网、云计算…

springMVC02,restful风格,请求转发和重定向

springMVC02,restful风格,请求转发和重定向restful风格restful简介restful 例子测试请求转发和重定向restful风格 restful简介 概念: Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,…

第10章Swagger自定义实现index.html页

1 初始化index.html页 复制原程序“index.html”页的内容到当前程序员“index.html”页。 注意:是内容复制,如果是页面替换复制,则必须重新把“index.html”页的属性中的“生成操作”设定为:“嵌入的资源”。 2 自定义SwaggerSet…

【数据结构】堆和优先级队列

目录 一、堆 1.1堆的特点 1.2如何构造一个最大堆 (1)最大堆的构造以及常用方法的实现 (2)添加操作 (3)删除操作 (3)将任意数组调整为堆 二、TopK问题 2.1使用优先级队列 &am…

jenkins 参数化构建发布到kubernetes集群不同的命名空间下

最终效果 在构建前可以选择参数,要拉取的Git分支、什么命名空间下、什么服务。 自由风格项目使用的jenkins agent镜像,请参考这个文章: 【DevOps】(2022.11更新)基于jenkins/jnlp-slave:4.13.3-1-jdk11镜像,加入kubectl、mvn命令_阳光很暖吧的博客-CSDN博客 1、自由风格项…

广告和电商应该怎么串联起来呢?我们可以从各大巨头的动作中发掘

电商广告是广告产业与电子商务模式联姻的时代产物,是把广告、传媒、营销推广产业链的各种产品和服务搬到网上,利用网络便捷的实现广告资源信息流通、在线交易和客户关系管理的一种商业模式,是广告业营销模式和渠道的创新。 电商平台从无到有…

一篇文章彻底理解自定义View

目录 一.View的基础 1.view的基础概念 2.view的位置和事件event几种表示法 3.view的滑动 ①.ScrollTo、ScrollBy: ②.布局位置(layout,offsetLeftAndRight,offsetTopAndBottom) ③.布局参数(LayoutParams) 4.view的弹性滑动 ①.ScrollercomputeScrollscrollTo ②.动画…

如何基于YAML设计接口自动化测试框架?看完秒会

在设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML、CSV)或者数据库中,实现脚本与数据解耦,方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测试用例&…

部署高校房屋管理系统可以实现哪些目标?

数图互通房产管理 随着技术的不断进步和升级,以及高校房屋建筑物数量的不断扩充,建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。数图互通自主研发的FMCenterV5.0平台,是针对中国高校房产的管理特点和管…

工业数据与数据采集应用如何在ARM+FPGA异核架构的米尔MYC-JX8MMA7核心板应用

随着通信与网络技术、互联网的发展,工业管理数据化、网络化、智能化已成大势所趋,利用工业物联网完成工业控制是智慧工厂中必不可少的一部分。传统的控制与数据采集系统,主机一旦需要同时与多个数据采集设备保持高速通信,并要承担…

Golang【Web 入门】 07 路由 - http.ServeMux

阅读目录说明ServeMux 和 Handler重构:区分不同的 Handler查看 http.HandleFunc 源码重构:使用自定义的 ServeMuxhttp.ServeMux 的局限性URI 路径参数请求方法过滤不支持路由命名http.ServeMux 的优缺点标准库里的就是最好的?说明 goblog 需…

【运维心得】ApacheDirectory找不到java路径的解决方案

目录 ApacheDirectory是什么? 问题现象描述 解决步骤 总结 本文是因为没有在网上找到类似的问题和文章,只能依靠自己去解决,既然解决了,就应该分享一下,希望能帮到需要的朋友。 ApacheDirectory是什么&#xff1f…

火山引擎 DataTester 揭秘:字节如何用 A/B 测试,解决增长问题的?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 上线六年,字节跳动的短视频产品——抖音已成为许多人记录美好生活的平台。除了抖音,字节跳动旗下还同时运营着数十款产品,从资讯…

人工智能在网络安全中的重要性

介绍: 人工智能(AI)是计算机科学的一个分支,基于某些独特的算法和相关数学计算,使机器能够拥有人类的决策能力。另一方面,网络安全包括保护虚拟世界免受网络攻击和威胁的安全措施。人工智能能够通过采取与…

第二十一章《万年历》第1节:万年历项目简介

万年历项目实现的是一款日历软件,它能够展示出任意年份的日历,除此之外,该软件还能以红色字体标出每个月的阳历节日。 21.1.1万年历功能简介 万年历软件的运行结果如图21-1所示。 图21-1万年历软件界面 为方便讲述,此处把这个万年历的界面分成了4个区域,每个区域当中都有…