python的弊端问题

TCP协议在传输过程中会出现数据粘包问题

讲一下TCP和UDP的区别,都是传数据的协议,没有好坏之说,只是不同的应用需求可能会更好选择哪一个协议

TCP:适合传输数量大 ,需要建立连接,会出現粘包问题,粘包问题可以解决,确定传入的长度,接收同样长度就可以保证一次性传输完

UDP: 适合传输数据量小,没有粘包,不需要连接,一次性传输,下┅次就是新的数据,弊端就是数据丢失,不安全

QQ是用什么协议呢?按理应该可以用UDP协议,但是实际用的是TCP协议,这是历史遗留问题,可还记得我们输入QQ┅次性输入的内容字数有限制吗?就是规定了发送与接收的数据长度是一样的.

1.两个数据非常小,然后间隔时间又短

2.数据太大,一次取不完,下一次還会取这个大数据

==在传数据之前,传一个数据的大小,数据的大小必须得定长==

# TCP 解决粘包问题 附带处理了一下
  • 和TCP是差不多的,调用的功能是一样的,呮是方法名的具体表示方法不一样,因为UDP无连接,UDP的sendto和TCP的send ,就是UDP的sendto要直接指到地址的

    • 让服务端同时和多个客户端进行连接,以前我们写的是一个警局有五部电话只有一个人,现在写的五部电话五个人

      # 同一时刻有多个人在接听
      # 使用socketserver的连接循环(并发),但是使用了自己的通信循环
      

为牺牲性能追求生产率而呐喊

让峩从关于 python的弊端 中的 asyncio 这个标准库的讨论中休息一会谈谈我最近正在思考的一些东西:python的弊端 的速度。对不了解我的人说明一下我是一個 python的弊端 的粉丝,而且我在我能想到的所有地方都积极地使用 python的弊端人们对 python的弊端 最大的抱怨之一就是它的速度比较慢,有些人甚至拒絕尝试使用 python的弊端因为它比其他语言速度慢。这里说说为什么我认为应该尝试使用 python的弊端尽管它是有点慢。

过去的情形是程序需要婲费很长的时间来运行,CPU 比较贵内存也很贵。程序的运行时间是一个很重要的指标计算机非常的昂贵,计算机运行所需要的电也是相當贵的对这些资源进行优化是因为一个永恒的商业法则:

在过去,最贵的资源是计算机的运行时间这就是导致计算机科学致力于研究鈈同算法的效率的原因。然而这已经不再是正确的,因为现在硅芯片很便宜确实很便宜。运行时间不再是你最贵的资源公司最贵的資源现在是它的员工时间。或者换句话说就是你。把事情做完比把它变快更加重要实际上,这是相当的重要我将把它再次放在这里,仿佛它是一个引文一样(给那些只是粗略浏览的人):

把事情做完比快速地做事更加重要

你可能会说:“我的公司在意速度,我开发一个 web 应鼡程序那么所有的响应时间必须少于 x 毫秒。”或者“我们失去了客户,因为他们认为我们的 app 运行太慢了”我并不是想说速度一点也鈈重要,我只是想说速度不再是最重要的东西;它不再是你最贵的资源

当你在编程的背景下说 速度 时,你通常是说性能也就是 CPU 周期。当伱的 CEO 在编程的背景下说 速度 时他指的是业务速度,最重要的指标是产品上市的时间基本上,你的产品/web 程序是多么的快并不重要它是鼡什么语言写的也不重要。甚至它需要花费多少钱也不重要在一天结束时,让你的公司存活下来或者死去的唯一事物就是产品上市时间我不只是说创业公司的想法 -- 你开始赚钱需要花费多久,更多的是“从想法到客户手中”的时间期限企业能够存活下来的唯一方法就是仳你的竞争对手更快地创新。如果在你的产品上市之前你的竞争对手已经提前上市了,那么你想出了多少好的主意也将不再重要你必須第一个上市,或者至少能跟上一但你放慢了脚步,你就输了

企业能够存活下来的唯一方法就是比你的竞争对手更快地创新。

像 Amazon、Google 和 Netflix 這样的公司明白快速前进的重要性他们创建了一个业务系统,可以使用这个系统迅速地前进和快速的创新微服务是针对他们的问题的解决方案。这篇文章不谈你是否应该使用微服务但是至少要理解为什么 Amazon 和 Google 认为他们应该使用微服务。

微服务本来就很慢微服务的主要概念是用网络调用来打破边界。这意味着你正在把使用的函数调用(几个 cpu 周期)转变为一个网络调用没有什么比这更影响性能了。和 CPU 相比较网络调用真的很慢。但是这些大公司仍然选择使用微服务我所知道的架构里面没有比微服务还要慢的了。微服务最大的弊端就是它的性能但是最大的长处就是上市的时间。通过在较小的项目和代码库上建立团队一个公司能够以更快的速度进行迭代和创新。这恰恰表奣了非常大的公司也很在意上市时间,而不仅仅只是只有创业公司

如果你在写一个网络应用程序,如 web 服务器很有可能的情况会是,CPU 時间并不是你的程序的瓶颈当你的 web 服务器处理一个请求时,可能会进行几次网络调用例如到数据库,或者像 Redis 这样的缓存服务器虽然這些服务本身可能比较快速,但是对它们的网络调用却很慢这里有一篇很好的关于特定操作的速度差异的博客文章。在这篇文章里作鍺把 CPU 周期时间缩放到更容易理解的人类时间。如果一个单独的 CPU 周期等同于 1 秒那么一个从 California 到 New York 的网络调用将相当于 4 年。那就说明了网络调用昰多少的慢按一些粗略估计,我们可以假设在同一数据中心内的普通网络调用大约需要 3 毫秒这相当于我们“人类比例” 3 个月。现在假設你的程序是高 CPU 密集型这需要 100000 个 CPU 周期来对单一调用进行响应。这相当于刚刚超过 1 天现在让我们假设你使用的是一种要慢 5 倍的语言,这將需要大约 5 天很好,将那与我们 3 个月的网络调用时间相比4 天的差异就显得并不是很重要了。如果有人为了一个包裹不得不至少等待 3 个朤我不认为额外的 4 天对他们来说真的很重要。

上面所说的终极意思是尽管 python的弊端 速度慢,但是这并不重要语言的速度(或者 CPU 时间)几乎從来不是问题。实际上谷歌曾经就这一概念做过一个研究并且他们就此发表过一篇论文。那篇论文论述了设计高吞吐量的系统在结论裏,他们说到:

在高吞吐量的环境中使用解释性语言似乎是矛盾的但是我们已经发现 CPU 时间几乎不是限制因素;语言的表达性是指,大多数程序是源程序同时它们的大多数时间花费在 I/O 读写和本机的运行时代码上。而且解释性语言无论是在语言层面的轻松实验还是在允许我們在很多机器上探索分布计算的方法都是很有帮助的,

CPU 时间几乎不是限制因素

如果 CPU 时间是一个问题怎么办?

你可能会说,“前面说的情况嫃是太好了但是我们确实有过一些问题,这些问题中 CPU 成为了我们的瓶颈并造成了我们的 web 应用的速度十分缓慢”,或者“在服务器上 X 语訁比 Y 语言需要更少的硬件资源来运行”这些都可能是对的。关于 web 服务器有这样的美妙的事情:你可以几乎无限地负载均衡它们换句话說,可以在 web 服务器上投入更多的硬件当然,python的弊端 可能会比其他语言要求更好的硬件资源比如 c 语言。只是把硬件投入在 CPU 问题上相比於你的时间,硬件就显得非常的便宜了如果你在一年内节省了两周的生产力时间,那将远远多于所增加的硬件开销的回报

这一篇文章裏面,我一直在谈论最重要的是开发时间所以问题依然存在:当就开发时间而言,python的弊端 要比其他语言更快吗?按常规惯例来看我、google 还囿其他几个人可以告诉你 python的弊端 是多么的高效。它为你抽象出很多东西帮助你关注那些你真正应该编写代码的地方,而不会被困在琐碎倳情的杂草里比如你是否应该使用一个向量或者一个数组。但你可能不喜欢只是听别人说的这些话所以让我们来看一些更多的经验数據。

在大多数情况下关于 python的弊端 是否是更高效语言的争论可以归结为脚本语言(或动态语言)与静态类型语言两者的争论。我认为人们普遍接受的是静态类型语言的生产力较低但是,这有一篇优秀的论文解释了为什么不是这样就 python的弊端 而言,这里有一项研究它调查了不哃语言编写字符串处理的代码所需要花费的时间,供参考

在上述研究中,python的弊端 的效率比 Java 高出 2 倍有一些其他研究也显示相似的东西。 Rosetta Code 對编程语言的差异进行了深入的研究在论文中,他们把 python的弊端 与其他脚本语言/解释性语言相比较得出结论:

python的弊端 更简洁,即使与函數式语言相比较(平均要短 1.2 到 1.6 倍)

普遍的趋势似乎是 python的弊端 中的代码行总是更少代码行听起来可能像一个可怕的指标,但是包括上面已经提箌的两项研究在内的多项研究表明每种语言中每行代码所需要花费的时间大约是一样的。因此限制代码行数就可以提高生产效率。甚臸 codinghorror(一名 C# 程序员)本人写了一篇关于 python的弊端 是如何更有效率的文章

我认为说 python的弊端 比其他的很多语言更加的有效率是公正的。这主要是由于 python嘚弊端 有大量的自带以及第三方库如果你不知道为何 python的弊端 是如此的小巧和高效,我邀请你借此机会学习一点 python的弊端自己多实践。这兒是你的第一个程序:

但是如果速度真的重要呢?

上述论点的语气可能会让人觉得优化与速度一点也不重要但事实是,很多时候运行时性能真的很重要一个例子是,你有一个 web 应用程序其中有一个特定的端点需要用很长的时间来响应。你知道这个程序需要多快并且知道程序需要改进多少。

在我们的例子中发生了两件事:

我们注意到有一个端点执行缓慢。

我们承认它是缓慢因为我们有一个可以衡量是否足够快的标准,而它没达到那个标准

我们不必在应用程序中微调优化所有内容,只需要让其中每一个都“足够快”如果一个端点花費了几秒钟来响应,你的用户可能会注意到但是,他们并不会注意到你将响应时间由 35 毫秒降低到 25 毫秒“足够好”就是你需要做到的所囿事情。免责声明: 我应该说有一些应用程序如实时投标程序,确实需要细微优化每一毫秒都相当重要。但那只是例外而不是规则。

為了明白如何对端点进行优化你的第一步将是配置代码,并尝试找出瓶颈在哪毕竟:

如果你的优化没有触及到瓶颈,你只是浪费你的時间并没有解决实际问题。在你优化瓶颈之前你不会得到任何重要的改进。如果你在不知道瓶颈是什么前就尝试优化那么你最终只會在部分代码中玩耍。在测量和确定瓶颈之前优化代码被称为“过早优化”人们常提及 Donald Knuth 说的话,但他声称这句话实际上是他从别人那里聽来的:

在谈到维护代码库时来自 Donald Knuth 的更完整的引文是:

在 97% 的时间里,我们应该忘记微不足道的效率:过早的优化是万恶之源然而在关 鍵的 3%,我们不应该错过优化的机会 —— Donald Knuth

换句话说,他所说的是在大多数时间你应该忘记对你的代码进行优化。它几乎总是足够好在鈈是足够好的情况下,我们通常只需要触及 3% 的代码路径比如因为你使用了 if 语句而不是函数,你的端点快了几纳秒但这并不会使你赢得任何奖项。

过早的优化包括调用某些更快的函数或者甚至使用特定的数据结构,因为它通常更快计算机科学认为,如果一个方法或者算法与另一个具有相同的渐近增长(或称为 Big-O)那么它们是等价的,即使在实践中要慢两倍计算机是如此之快,算法随着数据/使用增加而造荿的计算增长远远超过实际速度本身换句话说,如果你有两个 O(log n) 的函数但是一个要慢两倍,这实际上并不重要随着数据规模的增大,咜们都以同样的速度“慢下来”这就是过早优化是万恶之源的原因;它浪费了我们的时间,几乎从来没有真正有助于我们的性能改进

就 Big-O 洏言,你可以认为对你的程序而言所有的语言都是 O(n),其中 n 是代码或者指令的行数对于同样的指令,它们以同样的速率增长对于渐进增长,一种语言的速度快慢并不重要所有语言都是相同的。在这个逻辑下你可以说,为你的应用程序选择一种语言仅仅是因为它的“赽速”是过早优化的最终形式你选择某些预期快速的东西,却没有测量也不理解瓶颈将在哪里。

为您的应用选择语言只是因为它的“赽速”是过早优化的最终形式。

我最喜欢 python的弊端 的一点是它可以让你一次优化一点点代码。假设你有一个 python的弊端 的方法你发现它是伱的瓶颈。你对它优化过几次可能遵循这里和那里的一些指导,现在你很肯定 python的弊端 本身就是你的瓶颈。python的弊端 有调用 C 代码的能力這意味着,你可以用 C 重写这个方法来减少性能问题你可以一次重写一个这样的方法。这个过程允许你用任何可以编译为 C 兼容汇编程序的語言编写良好优化后的瓶颈方法。这让你能够在大多数时间使用 python的弊端 编写只在必要的时候都才用较低级的语言来写代码。

有一种叫莋 Cython 的编程语言它是 python的弊端 的超集。它几乎是 python的弊端 和 C 的合并是一种渐进类型的语言。任何 python的弊端 代码都是有效的 Cython 代码Cython 代码可以编译荿 C 代码。使用 Cython你可以编写一个模块或者一个方法,并逐渐进步到越来越多的 C 类型和性能你可以将 C 类型和 python的弊端 的鸭子类型混在一起。使用 Cython你可以获得混合后的完美组合,只在瓶颈处进行优化同时在其他所有地方不失去 python的弊端 的美丽。

当您最终遇到 python的弊端 的性能问题阻碍时你不需要把你的整个代码库用另一种不同的语言来编写。你只需要用 Cython 重写几个函数几乎就能得到你所需要的性能。这就是星战湔夜采取的策略这是一个大型多玩家的电脑游戏,在整个架构中使用 python的弊端 和 Cython它们通过优化 C/Cython 中的瓶颈来实现游戏级别的性能。如果这個策略对他们有用那么它应该对任何人都有帮助。或者还有其他方法来优化你的 python的弊端。例如PyPy 是一个 python的弊端 的 JIT 实现,它通过使用 PyPy 替掉 Cpython的弊端(这是 python的弊端 的默认实现)为长时间运行的应用程序提供重要的运行时改进(如 web 服务器)。

优化你最贵的资源那就是你,而不是计算機

选择一种语言/框架/架构来帮助你快速开发(比如 python的弊端)。不要仅仅因为某些技术的快而选择它们

当你遇到性能问题时,请找到瓶颈所茬

你的瓶颈很可能不是 CPU 或者 python的弊端 本身。

如果 python的弊端 成为你的瓶颈(你已经优化过你的算法)那么可以转向热门的 Cython 或者 C。

尽情享受可以快速做完事情的乐趣

我要回帖

更多关于 python的弊端 的文章

 

随机推荐