向咨询下各位大神, Python 初有小成之后,有没有必要回过头去学 C++…

2017-12-22 22:47:18 +08:00
 praynise
小弟是自学 python,并应用在了工作之中。由于小弟是做运维的,所以…其实对一个工具的运行效率并不非常在意。不过有的时候,还是希望有些地方能够执行的更快些。请问各位大神,在各位的 python 生涯中,用 C 库加速 python 的场景多么?是否有必要学习一下 C++呢?
5026 次点击
所在节点    Python
18 条回复
SlipStupig
2017-12-22 22:59:19 +08:00
为什么不选 go 呢?
lolizeppelin
2017-12-22 23:34:55 +08:00
要 c 会 c 才能看 linux 源码
neoblackcap
2017-12-23 00:29:02 +08:00
@praynise 据我了解,多数扩展库都是用 C 写的,大概是人们不想再写一个 wrapper 吧。C 库加速 python 的场景只能说业务方的需求更大。单纯运维的角度用得并不多,除非你会细到内核之类的地方,这些地方 python 的确是比较缺失的。比如你基于 eBPF 写一个非入侵式的 profiler,那么用 C 是必然的。或者一些辅助 coredump 时收集资料的,可能还是得用到 C,否则以我一个 devops 的经验来看,用得真不多。
yexiaoxing
2017-12-23 05:00:32 +08:00
我觉得… 还是有必要的…
至少知道一些比较底层的东西,以后优化也有好处?
noqwerty
2017-12-23 05:14:17 +08:00
当你要处理的东西到了一定数量级,又是很小众别人没做过(优化过)的问题,就需要自己撸袖子开干了。
cdlixucd
2017-12-23 05:17:49 +08:00
我靠 运维还要写代码😭
jimzhong
2017-12-23 07:31:06 +08:00
可以学 C,顺便看看 CPython 的实现。
sunwei0325
2017-12-23 08:54:08 +08:00
我心中的 python 大神董伟明也是运维转开发的, 老铁加油
Flobit
2017-12-23 09:03:33 +08:00
其实编程重要的是思想,语言大多数都相通的,思想很重要,语言只是个工具,C++有必要了解下,不要深入,如果你想学 python 的话
Morriaty
2017-12-23 09:11:55 +08:00
我还是坚持认为需要什么再学什么,而不是人云亦云的学习。

比如你在使用 docker 的过程中,遇到了一些 UNdocumented feature,这时候你可能真的需要去源码里看一眼,那就该去看一眼 go 和虚拟化技术了。

再比如 java、流处理之于 storm ; scala、分布式理论之于 spark,etc.
ipwx
2017-12-23 09:33:09 +08:00
boost::python 可以黏合 python 和 c++。
不过要学到玩转 boost 库的程度,需要时间。
secondwtq
2017-12-23 09:53:50 +08:00
Python 和 C++ 没关系,Python 更像是 C 变成脚本语言之后做了一些增强的产物
justou
2017-12-23 10:55:45 +08:00
说说我从 python 深入下去的思路: Python → Cython → C → C++

Python:
各种入门级书籍, 官方文档教程→The Python3 Standard Library by Example(新出的) /Python Cookbook /Fluent Python

Cython:
官方文档 → Learning Cython Programming/Cython A Guide for Python Programmers

C:
kenneth A Reek, Pointers on C(C 与指针) → Expert C Programming: Deep C Secrets(C 专家编程) → C Traps and Pitfalls(C 陷阱与缺陷) 这三部曲都有影印版

(这时候可以开始读 Python 源码了, 有一本叫<python 源码剖析>的书很值得参考, 虽然比较老,好像是剖析的 py2.5)

C++:
C++ Primer(写得有点啰嗦, 以前我用这个入门的, 应该还有更好的) → The C++ Standard Library: A tutorial and reference(2nd) → C++ Templates The Complete Guide(2nd)(最近才出的 2, 详述了 C++11/C++14/C++17 的模板特性) → Effective Modern C++ , Optimized C++ , Clean C++ 等各种修炼 c++内功的, C++ Concurrency in Action 专门讲多线程编程的...

-----------------------------------------------------------

以上仅仅是从编程语言方面的思路, 个人觉得学习曲线没那么陡, 但是比较长---看似比较长, 但有一定积累后可以接收得很快, 虽然是在走上坡路, 但是积累的东西会让你做加速运动, 但在学的时候要多加实践多做笔记, 不然忘得飞快. 数据结构算法是必须的, 数据库网络,计算机系统, 操作系统,编译原理之类的根据自己的方向和需求去补充.

最后的编程技能就是 Python/Cython/C/C++的组合拳, 面对实际问题时可以施展得很开.

在学校的时候做计算物理, 用 Cython/C/C++加速 Python 用得挺多的, Python 很多时候是做数据的预处理, 以及一些不是计算密集型的数据处理(数据处理毕竟是 py 强项), 然后计算密集型的就用 Cython/C/C++完成(在 numpy/scipy 无法满足性能要求的情况下), 最后返回结果给 Python 后处理; 到公司后做图像算法, Python 常用来做一些给大家用的小工具(PyQt), 图像批处理, 算法测试, 差不多当脚本用了, 最后算法是用 C++写成 dll 给后端的 C#调用, 因为我不太懂 C#, 后端哥们儿又不太懂 C++, 对接起来很是尴尬, 最近我们准备组队一起刷 C++跟 C#
ryd994
2017-12-23 11:45:47 +08:00
@neoblackcap c++可以用 C wrapper 啊,这是标准所定义的
合法的 C 代码一定也是合法的 C++代码
eliteYang
2017-12-23 11:49:07 +08:00
需要什么学什么吧,不然也容易手生,而且也写不好
neoblackcap
2017-12-23 12:18:49 +08:00
@ryd994 可以是可以,不过我觉得他们是懒了,的确大部分扩展都是 C 写的,C++写的太少了。
maobush
2017-12-23 22:07:31 +08:00
看需求,主要还是思想,语言只是工具
gnaggnoyil
2017-12-24 03:19:56 +08:00
@ryd994 C 和 C++的合法代码集合相互之间没有包含关系.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416963

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX