廖雪峰 python 教程中的一段话:“C 程序的运行时间需要 0.001 秒,而 Python 程序的运行时间需要 0.1 秒,慢了 100 倍,但由于网络更慢,需要等待 1 秒,你想,用户能感觉到 1.001 秒和 1.1 秒的区别吗?”
从时间上我觉得他说的对,确实不用太在乎他的执行速度,毕竟短板在其他的 io 上(如网络)
但是 cpu 呢,如果同样服务 1000 个客户端,c 只要 RK3588 就可以了,而 python 需要 12 代 I7 这成本就高了,是不是,特别是我们这种不停强调降本,低价吸客户的公司
其实我也不关注廖说的 1.1 秒还是 1.01 秒,只是如果完成这个工作,一个 cpu 花费 20hz ,一个花费 2000hz ,我就扛不住了,作为服务端程序,我得多堆叠 100 台服务器才能完成
![]() | 1 realpg PRO ![]() 这种问题你都要问, 说明你的知识储备量和公司职位不需要考虑这些问题 什么写的快用什么就行了 如果真需要考虑这种问题, 听架构的就完事 |
![]() | 2 wu67 11 天前 web 应用确实是这样的. 但是如果是多个任务流水线式执行起来呢? 如果是纯离线应用处理数据呢? 运行慢这个弊端就暴露出来了 |
![]() | 3 javalaw2010 11 天前 不合理,网络根本不需要 1s 。网络远比你想象得快的多。大家会说数据库查询慢,但没人会说网络慢,另外,1s 的数据库查询其实也可以归入到慢查询中了。 |
4 Donahue 11 天前 ![]() 各有各的优势,你不会想用 C 开发神经网络的(防杠,是开发不是部署),同样你也不太可能用 python 开发商用级别的单片机程序(防杠,不太可能表示还是有少量可能性的)。各自在不同场景下发挥作用。 |
5 superrichman 11 天前 ![]() 如果是极端追求性能、计算密集(比如游戏引擎、图像处理、金融高频交易),C 更合适。 如果是业务逻辑复杂、I/O 密集(比如 Web 服务、数据处理、原型验证),Python 完全够用,还能更快交付。 最佳实践是 混合使用:用 Python 写业务逻辑,用 C/C++/Rust 做性能关键模块。 |
6 emSaVya 11 天前 ![]() “但由于网络更慢,需要等待 1 秒” 你们的用户太棒了。 我们 p999 超过 20ms 老板就要求优化服务了。 |
![]() | 7 zhangrandl 11 天前 现在咱们遇到的场景,大概率到不了拼机器性能的地步,啥语言其实差别都不大,重要的是业务逻辑能跑通。真到了拼语言性能的地步的话,自然就有办法解决了,Java 性能也不如 C ,还不是一样能扛住电商并发。我是写 Python 的,经常有人给我说 Java 性能多好,我说就你们现在碰到的场景,有那研究语言性能的功夫,多申请俩服务器比啥都强 |
![]() | 8 cmos 11 天前 |
![]() | 9 vfs 11 天前 他所说的网络是 socket 层的等待时间,但是显示中往往还会有 tls ,http 等上层协议。 如果说 python 够快,那么应该使用 python 编写 ssl 实现,可以试试有多快 |
10 NessajCN 11 天前 先不说举个这么特例的情况来代表这两种语言的一般情况这种典型逻辑错误 就光说这个例子本身,我 C 比你 Python 快 100 倍,那不就说明我 C 能在同样返回时间里比你 Python 多处理 100 倍的任务吗。 你管这叫一样? |
12 spritecn 11 天前 现在除了 ai 训练场景,cpu 都是过剩的,没啥子大的意义 |
13 Hoo1379 11 天前 @superrichman 同意,现在手头同时有 c 和 py 的项目,py 重构到 c 成本太高,只能对关键逻辑重写 c 。要是业务逻辑变动稍微频繁点,单纯一个语言修改起来极其难受。但是这样对开发和架构的要求就高了。 |
![]() | 14 ejin 11 天前 ![]() 真的强调性能你上专用处理芯片啊。 用啥通用 CPU ,用啥通用编程语言嘛。 资源全踏马浪费了!电费里大部分都是浪费的资源!!! 专用芯片的处理能力远超通用芯片,差别相当于自行车和宇宙飞船的区别。 |
![]() | 15 mightybruce 11 天前 python 和 从来就不是对立的, 快速迭代开发 + 关键代码和库重构就是 核心, 往往是核心模型比如计算以及网络底层处理用 c/c++/rust 写,python 做业务层调用封装好的共享链接库。 比如 Opencv, libuv 的库的封装, 可以说 python 能达到几乎 c 的 70%水平,比 java jni 调用 opencv 都快多了, libuv 的 库 导出为 python 接口有一个叫做 Pyuv ffmpeg 的众多库如 libavcodec, libavformat, libavutil, libswscale 的接口导出叫做 PyAV. |
![]() | 16 ejin 11 天前 ![]() 货比货得扔,人比人得死啊。 针对你的需求,理性选择就好。 如果合适,你就选。 不要做无意义的对比,有时候看似更低的成本,其实附加成本更高。 你的对比方法,其实就相当每个女生的想法: 到底是嫁给亿级富翁,还是百万级富翁。 但前提是,你的情况是什么样的,有没有得选。 现在 amd intel 的 cpu ,制程先进程度根本就不是最新的,精度并不是最高的,至少落后最高精度的 2-3 个档次,你猜为什么?难道是他们不想吗?他们甚至不用管生产,只需要设计就足够,为什么他们不采用高技术的精度呢?这到底是为什么呢? |
17 Dropless 11 天前 你关注的点是吞吐量,处理速度会影响吞吐量,但不是唯一决定因素。 |
18 raycool 11 天前 python 和 c 肯定不一样啊,有不同的应用场景,纠结这个没意义。 |
![]() | 19 mightybruce 11 天前 由于 Python 和 C++ 相互调用操作太好了, 所以不少 c++库 都可以调用 python, 而 python 也可以调用导出的 ffi 接口 libboost-python 就是 Boost.Python 能够完成 python 和 c++ 相互调用. |
![]() | 20 EdmondGUO 11 天前 @emSaVya 哥们的用户都是电竞小子吗 20ms 就受不了了 |
21 thinkershare 11 天前 大家觉得 python 不慢是因为那些 python 很慢的东西,大家选择了用 c/c++实现,然后用 python 做 wrapper. python 所有普遍对性能有要求的包,无不是如此实现的。 |
![]() | 22 NoobPhper 11 天前 java 之父马士兵。python 之父廖雪峰 |
![]() | 23 wakarimasen 11 天前 有的时候劳动力成本比服务器成本要高,比如加台机器一年要花几万,但是几万元你未必能雇佣到能省下这台机器的工程师。 |
![]() | 24 darkengine 11 天前 ![]() 一个 cpu 花费 20hz ,一个花费 2000hz 。。。怎么还有花费赫兹的说法。。。。 说句得罪人的话,80%的项目都等不到它的 1000 个用户。 |
25 paopjian 11 天前 网页交互的实时性需求并不是那么高吧, 技术栈选 python 还是为了快速上马 快速迭代开发, 而且 python 也能调用底层库优化速度, 感觉没有那么不堪, 循环什么的慢倒是真的慢. 不然也不会有 numba 什么事了, GIL 虽然是个不好用的东西,但是省心智了 |
26 zpxshl 11 天前 via Android @javalaw2010 我们线上统计,客户端发网络请求到收到回复。90 分位要 1 秒以上的。 |
27 penzi 11 天前 如果讨论 service ,python 垃圾并不是垃圾在计算性能 |
用 Julia 就行了 |
![]() | 29 minami 11 天前 考虑到 Python 在 90%以上的情况下都是指 CPython ,那 Python 就是 C ,你嫌慢写 C 函数呗,这就是个胶水语言 |
![]() | 30 skye 11 天前 当用单个用户请求 case 来评估服务器容量的时候,对不对已经不太重要了,开心就好 |
![]() | 31 xwander 11 天前 纸上得来终觉浅,直接看别人的源码你会提升更快。 就算是 C 语言已经很快,Linux 内核代码里,容易造成性能瓶颈的地方往往是直接用汇编。一个成熟的项目往往都是混合语言的,Python 调库,C 语言实现库,并存优于单一语言实现。 |
33 xizh007 11 天前 看你要不要 "先把东西做出来" |
![]() | 34 iyaozhen 11 天前 其实很多项目,一天平均 qps 还没开发人员多 不过话说回来,如果单纯 python web ,确实垃圾,谁用过谁知道 |
![]() | 35 CaptainD 11 天前 火车和皮卡。。。 |
![]() | 36 wangtian2020 11 天前 错误的,python 和 nodejs 一样,我公司 95%的业务都用 python 写,但是最近一个新项目我用 nodejs 写后端了 |
![]() | 37 Immunize 11 天前 错误的,网络延迟你可以靠并发去掩盖,比如单个用户 0.1s (处理时间) + 0.9s (传输时间) 的场景,大可以在等待 IO 的时候去服务其他用户,毕竟网络 Socket 本身是交给内核去处理。但是如果处理时间要 1s ,那真的就只能处理 1/10 的用户了。 |
![]() | 38 felixcode 11 天前 理论上很多模块可以用 FPGA 实现,用 Verilog 编写,只是开发量大了一点点点而已,但速度又是几十倍的提升啊 |
39 skallz 11 天前 现在绝大部分 web 项目都不太需要考虑服务器性能问题,用户量和数据量根本上不去。。。等到真需要性能的时候,加机器比加人换语言写性能更好的代码更有性价比,等到加机器搞不定的时候再换语言重构部分服务就行(除非项目一开始就定位为用户量大了),就算淘宝也是从 php 到 java 这样的历程走过来的 |
40 zepc007 11 天前 ![]() 一个是你舒服,另外一个是机器舒服,你选择哪个舒服? |
![]() | 41 xuanbg 11 天前 我写的服务,接口响应速度一般都在 10ms 以下。1 秒的响应速度是不可能被接受的 |
42 dule 11 天前 所以写个代码我还要考虑机器会不会跑的太累?我只知道我用 python 舒服,前期先快速抢占市场,项目活了有稳定盈利,才有资格谈论优化 Instagram 日活 2.5 亿、Reddit 都是 python ,请问咱是什么公司就考虑性能了,跟用什么语言写有个毛关系? |
43 prosgtsr 11 天前 via iPhone 现在有一种语言可以让你的接口响应时间减半,但是你的每日工作时间由 8 小时变为 12 小时,工资待遇不变,你换不换吧就说 |
![]() | 44 iorilu 11 天前 @darkengine 1000 可以换成 100 |
45 gam2046 11 天前 这个逻辑就像兰博基尼和我自行车的速度是一样的,反正大家都要等红绿灯。 |
46 red13 11 天前 “C 程序的运行时间需要 0.001 秒,而 Python 程序的运行时间需要 0.1 秒,慢了 100 倍,但由于网络更慢,需要等待 1 秒,你想,用户能感觉到 1.001 秒和 1.1 秒的区别吗?” 这句话完全没有 Python 和 C 是一样的 这个意思 |
47 codersdp1 11 天前 在 IO 密集型应用中听起来没毛病,CPU 密集型应用就不得行了。 |
48 chenqh 11 天前 PHP 都能用来做 web,python 为什么不可以呢? |
49 QiShine 11 天前 引力波发现的数据分析也是 python 搞的 |
![]() | 50 opengps 11 天前 你真要考虑这问题的话,不要放到服务器上考虑,而是放到那种超低端的单片机上去考虑,这时候才是需要考虑这个问题的时候 对于服务器来说,早就脱离单体程序了,比较轻松的可以选择升级配置更换硬件甚至直接分布式集群解决瓶颈。 |
![]() | 51 bruce0 11 天前 @HiHuan 这个可能真不是吹牛皮,我们原来打算用云的 redis,但是云的 redis 的网络延迟在 100 微秒左右(没看错,就是在 100 微秒 0.1ms),联系了他们的 redis,网络工程师等等一起研究,网络工程师说因为涉及到多跳,最少 100 微秒左右.我们使用 redis 在单线程中,没有多线程并发(祖传的,就是这样用,要改相当于整个游戏存储重写),这样会把 QPS 限制在不到 1w,我记得在 7000 左右. 因为一个玩家登录,会涉及到到次 redis 读写,所以只要在线人数超过 1000 人,这个服就开卡了.没法办,我们只能用自建的 redis,使用 127 直连 |
52 xiaomushen 11 天前 ![]() @bruce0 游戏服务端应用还是尽量单体。另外,你直接用内存不香么?干嘛要用 redis ?我们是直接移植 redis 代码,静态编译在应用里的(因为要用那些数据结构,反复了很久,决定直接用 redis 代码) |
53 clarkethan 11 天前 首先是人,其次是场景,最后才是语言 最近刚被合作伙伴的 python 小子坑了一把,第三方把金额、汇率之类的数据以字符串的形式给他,他转成浮点数,内部很多逻辑处理完,然后再把一堆数据转成字符串给我,于是,那天我听着窗外台风桦加沙的呼呼声,远程教他为什么有些数据会有一点点对不上 其实人是真正决定最终跑得好不好的最大因素,python 队伍里面半吊子太多 |
54 nyxsonsleep 10 天前 python 胶水层可以慢慢优化,问题不大。只要业务在云上就行。 |
55 zhhcnn 10 天前 如果是一个 1 秒执行一次的操作,你为什么要在乎他执行需要 1ms 还是 1s ,对你来说有区别吗,等需要 1 秒执行 1000 次再考虑性能 |
56 Dispatcher 10 天前 实际上 python 和 c 对比不合理,因为一个是编译,一个是解释执行。二者没有对比性,就像同样是飞机,一个是螺旋桨,一个是涡喷。 如果说都是解释执行,c 和 lua 更近一些。用 lua 和 python 对比可能更好一些;但是很可惜,lua 完胜,python 完败。 这并不是说 python 一无是处,衡量一个语言的生命力,我觉得要看: 1 、生态; 2 、场景; 3 、未来。 当下的 python 的生态是当之无愧的第一,我觉得这个结论应该是无人质疑的吧; python 在可预见的未来,也不太会象是 perl 、ruby 一样陨落; 唯一的争议是 python 的性能方面的劣势;不过对于非密集计算场景,其实大多数时候足够用了; |
![]() | 58 cufezhusy 10 天前 金融行业 Python 肉眼可见的越来越流行。开发速度快实在是太重要了 |
59 nightwitch 10 天前 计算密集型和 IO 密集型的场景都分不开的话不用考虑这个问题 |
60 smlcgx 10 天前 via iPhone 现在不是流行先做,再完美吗? py 正好适合干这个 |
![]() | 61 bruce0 10 天前 @prosgtsr #57 @xiaomushen #52 游戏中的全局数据,还有在线玩家的数据都在内存中,这些肯定不是读 redis 的,但是数据要落地啊,要不然游戏重启,崩了,机器故障了,数据不全没了,我们直接拿 redis 开 AOF 当落地数据用,不是所有数据都存在 redis 里,很多数据还是在内存里的 |
![]() | 62 encro 10 天前 首先 python 性能很差吗? 性能最差的 django 现在采用异步,如果你 sql 写的没问题,一个普通接口也就 20ms 能返回前端了。 一台普通虚拟机支持几百几千 qps 毫无问题。 |
63 fredweili 10 天前 关心这个,还不如想想写 AI 到底怎么搞,只有 python 类库全啊 |
![]() | 64 mightybruce 10 天前 @bruce0 你这种情况, 第一看你游戏中的是什么数据, 如果是虚拟资产,那么的确要存数据库。 其次正在进行的游戏数据当然放在内存中,通过各种缓存库操作, 不需要实时读取的数据, 放 kvrocks 中,kvrocks 整合 redis 和 rocksdb 用来写数据 |
![]() | 65 bruce0 10 天前 @mightybruce #64 游戏中所有数据(就是玩家的虚拟资产,绝对不能丢的),用过 kvrocks 类似的 pikiwidb,相比 redis 延迟稍高点,鬼区没问题,活跃区,可能会出现部分场景下卡顿 |
66 cnbatch 10 天前 一样?不用太在乎他的执行速度?猜猜为什么 shadowsocks 有了原始 Python 版本后有人用 C 改写(最后用 Rust 改写) |
![]() | 67 lanisle 10 天前 这话题不值得大家花时间讨论吧……你们时间不值钱吗? |
68 xiaomushen 9 天前 @bruce0 对啊,要落地。所以我们直接移植了 redis 的部分代码,静态编译进了服务端应用里 少了网络层面通讯损耗,多香! |
![]() | 69 bruce0 9 天前 @xiaomushen #68 懂了,但是我们开发用的 go,交叉编译还是有点嗦,中间有想过直接内嵌 leveldb 的(有人把 leveldb 包装成 go 的接口了) 但是这样做基本还是要重写存储层,不如直接 127 连 redis 方便 |
![]() | 70 msg7086 9 天前 公司都要降本了,还要花大钱请 C 程序员花大量时间写 C 代码?不是直接找几个大学生开着 AI 糊出来个脚本就完事了吗。 |
71 xiaomushen 7 天前 @bruce0 重写存储层工作量是大,但长痛不如短痛,个人认为,这样的研发投资,是值得去做的 |
![]() | 72 chunhuitrue 7 天前 外行才拿 python 和 c 比运行速度。 |
73 yanqiyu 7 天前 但是服务器要同时处理服务 1000 个并发请求,这些人的 1s 的网络等待可以(几乎)无代价的重叠,只剩下一秒多等待,但是 CPU 开销可是实打实加起来算的,代码更快就可以省下买 CPU 的钱。 或者说网络的等待决定的事延迟,你程序耗的 CPU 时间决定了吞吐。 |
75 jackOff 6 天前 python 可以快速验证业务可行性和方便科学计算以及 ai 训练,c 属于极致的性能优化和工艺技术,培养一个具有商业价值的 c 程序员很困难,但是培养好了做嵌入式开发也好做游戏开发也好都是挺吃香的,只是现在的市场到底有没有耐心去培养 c 程序员? python 的胶水特性 cython 也使得复杂的 c 编程变成了简单的 c 包调用,尤其是最新多线程放开的尝试下,其性能也逐步提升,目前也有在手机上原生携带 linux 系统的趋势,如果这个趋势加上手机配置的增强,作为快速变现产品来说,python 的产品验证周期比 C 要快很多 |
76 dayeye2006199 4 天前 via Android 听 python 之父的 |