python中(计算机语言python模拟计算),为什么代码写出来可以运行*+-,但是/就有问题?请大神提点提点

Access denied | www.vpsee.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.vpsee.com) has banned your access based on your browser's signature (40f9ca0-ua98).51CTO旗下网站
告诉你为什么Python有点慢,但我却无所谓?
人们对 Python 最大的抱怨之一就是它的速度比较慢,有些人甚至拒绝尝试使用 Python,因为它比其他语言速度慢。这里说说为什么我认为应该尝试使用 Python,尽管它是有点慢。
作者:佚名来源:Linux中国| 16:03
为牺牲性能追求生产率而呐喊
让我从关于 Python 中的 asyncio 这个标准库的讨论中休息一会,谈谈我最近正在思考的一些东西:Python
的速度。对不了解我的人说明一下,我是一个 Python 的粉丝,而且我在我能想到的所有地方都积极地使用 Python。人们对 Python
最大的抱怨之一就是它的速度比较慢,有些人甚至拒绝尝试使用 Python,因为它比其他语言速度慢。这里说说为什么我认为应该尝试使用
Python,尽管它是有点慢。
速度不再重要
过去的情形是,程序需要花费很长的时间来运行,CPU
比较贵,内存也很贵。程序的运行时间是一个很重要的指标。计算机非常的昂贵,计算机运行所需要的电也是相当贵的。对这些资源进行优化是因为一个永恒的商业法则:
优化你最贵的资源。
在过去,最贵的资源是计算机的运行时间。这就是导致计算机科学致力于研究不同算法的效率的原因。然而,这已经不再是正确的,因为现在硅芯片很便宜,确实很便宜。运行时间不再是你最贵的资源。公司最贵的资源现在是它的员工时间。或者换句话说,就是你。把事情做完比把它变快更加重要。实际上,这是相当的重要,我将把它再次放在这里,仿佛它是一个引文一样(给那些只是粗略浏览的人):
把事情做完比快速地做事更加重要。
你可能会说:&我的公司在意速度,我开发一个 web 应用程序,那么所有的响应时间必须少于 x 毫秒。&或者,&我们失去了客户,因为他们认为我们的 app
运行太慢了。&我并不是想说速度一点也不重要,我只是想说速度不再是最重要的东西;它不再是你最贵的资源。
速度是唯一重要的东西
当你在编程的背景下说 速度 时,你通常是说性能,也就是 CPU 周期。当你的 CEO 在编程的背景下说 速度
时,他指的是业务速度,最重要的指标是产品上市的时间。基本上,你的产品/web
程序是多么的快并不重要。它是用什么语言写的也不重要。甚至它需要花费多少钱也不重要。在一天结束时,让你的公司存活下来或者死去的唯一事物就是产品上市时间。我不只是说创业公司的想法
你开始赚钱需要花费多久,更多的是&从想法到客户手中&的时间期限。企业能够存活下来的唯一方法就是比你的竞争对手更快地创新。如果在你的产品上市之前,你的竞争对手已经提前上市了,那么你想出了多少好的主意也将不再重要。你必须第一个上市,或者至少能跟上。一但你放慢了脚步,你就输了。
企业能够存活下来的唯一方法就是比你的竞争对手更快地创新。
一个微服务的案例
像 Amazon、Google 和 Netflix
这样的公司明白快速前进的重要性。他们创建了一个业务系统,可以使用这个系统迅速地前进和快速的创新。微服务是针对他们的问题的解决方案。这篇文章不谈你是否应该使用微服务,但是至少要理解为什么
Amazon 和 Google 认为他们应该使用微服务。
微服务本来就很慢。微服务的主要概念是用网络调用来打破边界。这意味着你正在把使用的函数调用(几个 cpu
周期)转变为一个网络调用。没有什么比这更影响性能了。和 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 更快一些吗?
这一篇文章里面,我一直在谈论最重要的是开发时间。所以问题依然存在:当就开发时间而言,Python 要比其他语言更快吗?按常规惯例来看,我、google
还有其他几个人可以告诉你 Python
是多么的高效。它为你抽象出很多东西,帮助你关注那些你真正应该编写代码的地方,而不会被困在琐碎事情的杂草里,比如你是否应该使用一个向量或者一个数组。但你可能不喜欢只是听别人说的这些话,所以让我们来看一些更多的经验数据。
在大多数情况下,关于 python
是否是更高效语言的争论可以归结为脚本语言(或动态语言)与静态类型语言两者的争论。我认为人们普遍接受的是静态类型语言的生产力较低,但是,这有一篇优秀的论文解释了为什么不是这样。就
Python 而言,这里有一项研究,它调查了不同语言编写字符串处理的代码所需要花费的时间,供参考。
在上述研究中,Python 的效率比 Java 高出 2 倍。有一些其他研究也显示相似的东西。 Rosetta Code
对编程语言的差异进行了深入的研究。在论文中,他们把 python 与其他脚本语言/解释性语言相比较,得出结论:
Python 更简洁,即使与函数式语言相比较(平均要短 1.2 到 1.6 倍)
普遍的趋势似乎是 Python
中的代码行总是更少。代码行听起来可能像一个可怕的指标,但是包括上面已经提到的两项研究在内的多项研究表明,每种语言中每行代码所需要花费的时间大约是一样的。因此,限制代码行数就可以提高生产效率。甚至
codinghorror(一名 C# 程序员)本人写了一篇关于 Python 是如何更有效率的文章。
我认为说 Python 比其他的很多语言更加的有效率是公正的。这主要是由于 Python 有大量的自带以及第三方库。如果你不知道为何 Python 是如此的小巧和高效,我邀请你借此机会学习一点
python,自己多实践。这儿是你的第一个程序:
import&__hello__&
但是如果速度真的重要呢?
上述论点的语气可能会让人觉得优化与速度一点也不重要。但事实是,很多时候运行时性能真的很重要。一个例子是,你有一个 web
应用程序,其中有一个特定的端点需要用很长的时间来响应。你知道这个程序需要多快,并且知道程序需要改进多少。
在我们的例子中,发生了两件事:
我们注意到有一个端点执行缓慢。
我们承认它是缓慢,因为我们有一个可以衡量是否足够快的标准,而它没达到那个标准。
我们不必在应用程序中微调优化所有内容,只需要让其中每一个都&足够快&。如果一个端点花费了几秒钟来响应,你的用户可能会注意到,但是,他们并不会注意到你将响应时间由
35 毫秒降低到 25 毫秒。&足够好&就是你需要做到的所有事情。免责声明:
我应该说有一些应用程序,如实时投标程序,确实需要细微优化,每一毫秒都相当重要。但那只是例外,而不是规则。
为了明白如何对端点进行优化,你的第一步将是配置代码,并尝试找出瓶颈在哪。毕竟:
任何除了瓶颈之外的改进都是错觉。Any improvements made anywhere besides the bottleneck are an
illusion. -- Gene Kim
如果你的优化没有触及到瓶颈,你只是浪费你的时间,并没有解决实际问题。在你优化瓶颈之前,你不会得到任何重要的改进。如果你在不知道瓶颈是什么前就尝试优化,那么你最终只会在部分代码中玩耍。在测量和确定瓶颈之前优化代码被称为&过早优化&。人们常提及
Donald Knuth 说的话,但他声称这句话实际上是他从别人那里听来的:
过早优化是万恶之源Premature optimization is the root of all evil。
在谈到维护代码库时,来自 Donald Knuth 的更完整的引文是:
在 97% 的时间里,我们应该忘记微不足道的效率:过早的优化是万恶之源。然而在关 键的 3%,我们不应该错过优化的机会。 && Donald
换句话说,他所说的是,在大多数时间你应该忘记对你的代码进行优化。它几乎总是足够好。在不是足够好的情况下,我们通常只需要触及 3%
的代码路径。比如因为你使用了 if 语句而不是函数,你的端点快了几纳秒,但这并不会使你赢得任何奖项。
过早的优化包括调用某些更快的函数,或者甚至使用特定的数据结构,因为它通常更快。计算机科学认为,如果一个方法或者算法与另一个具有相同的渐近增长(或称为
Big-O),那么它们是等价的,即使在实践中要慢两倍。计算机是如此之快,算法随着数据/使用增加而造成的计算增长远远超过实际速度本身。换句话说,如果你有两个
的函数,但是一个要慢两倍,这实际上并不重要。随着数据规模的增大,它们都以同样的速度&慢下来&。这就是过早优化是万恶之源的原因;它浪费了我们的时间,几乎从来没有真正有助于我们的性能改进。
就 Big-O 而言,你可以认为对你的程序而言,所有的语言都是 O(n),其中 n
是代码或者指令的行数。对于同样的指令,它们以同样的速率增长。对于渐进增长,一种语言的速度快慢并不重要,所有语言都是相同的。在这个逻辑下,你可以说,为你的应用程序选择一种语言仅仅是因为它的&快速&是过早优化的最终形式。你选择某些预期快速的东西,却没有测量,也不理解瓶颈将在哪里。
为您的应用选择语言只是因为它的&快速&,是过早优化的最终形式。
优化 Python
我最喜欢 Python 的一点是,它可以让你一次优化一点点代码。假设你有一个 Python
的方法,你发现它是你的瓶颈。你对它优化过几次,可能遵循这里和那里的一些指导,现在,你很肯定 Python 本身就是你的瓶颈。Python 有调用 C
代码的能力,这意味着,你可以用 C 重写这个方法来减少性能问题。你可以一次重写一个这样的方法。这个过程允许你用任何可以编译为 C
兼容汇编程序的语言,编写良好优化后的瓶颈方法。这让你能够在大多数时间使用 Python 编写,只在必要的时候都才用较低级的语言来写代码。
有一种叫做 Cython 的编程语言,它是 Python 的超集。它几乎是 Python 和 C 的合并,是一种渐进类型的语言。任何 Python
代码都是有效的 Cython 代码,Cython 代码可以编译成 C 代码。使用 Cython,你可以编写一个模块或者一个方法,并逐渐进步到越来越多的 C
类型和性能。你可以将 C 类型和 Python 的鸭子类型混在一起。使用 Cython,你可以获得混合后的完美组合,只在瓶颈处进行优化,同时在其他所有地方不失去
Python 的美丽。
星战前夜的一幅截图:这是用 Python 编写的 space MMO 游戏。
当您最终遇到 Python 的性能问题阻碍时,你不需要把你的整个代码库用另一种不同的语言来编写。你只需要用 Cython
重写几个函数,几乎就能得到你所需要的性能。这就是星战前夜采取的策略。这是一个大型多玩家的电脑游戏,在整个架构中使用 Python 和 Cython。它们通过优化
C/Cython 中的瓶颈来实现游戏级别的性能。如果这个策略对他们有用,那么它应该对任何人都有帮助。或者,还有其他方法来优化你的 Python。例如,PyPy
是一个 Python 的 JIT 实现,它通过使用 PyPy 替掉 CPython(这是 Python
的默认实现),为长时间运行的应用程序提供重要的运行时改进(如 web 服务器)。
让我们回顾一下要点:
优化你最贵的资源。那就是你,而不是计算机。
选择一种语言/框架/架构来帮助你快速开发(比如 Python)。不要仅仅因为某些技术的快而选择它们。
当你遇到性能问题时,请找到瓶颈所在。
你的瓶颈很可能不是 CPU 或者 Python 本身。
如果 Python 成为你的瓶颈(你已经优化过你的算法),那么可以转向热门的 Cython 或者 C。
尽情享受可以快速做完事情的乐趣。
我希望你喜欢阅读这篇文章,就像我喜欢写这篇文章一样。如果你想说谢谢,请为我点下赞。另外,如果某个时候你想和我讨论 Python,你可以在 twitter
上艾特我(@nhumrich),或者你可以在 Python slack channel 找到我。
作者简介:
Nick Humrich -- 坚持采用持续交付的方法,并为之写了很多工具。同是还是一名 Python 黑客与技术狂热者,目前是一名 DevOps
工程师。【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点头条热点关注头条
24H热文一周话题本月最赞
讲师:747358人学习过
讲师:26339人学习过
讲师:353114人学习过
CTO专属活动
精选博文论坛热帖下载排行
本书为《Eclipse从入门到精通》一书的全新改版。本书以最新的Eclipse 3.2作为写作版本。全书分为5篇:起步篇介绍了Eclipse及相关插件的安装...
订阅51CTO邮刊用Python写过哪些「脑洞大开」的小工具? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="3,470分享邀请回答weibo.com/duxu0805)之前会每小时自动发布一条微博,附带一张壁纸图片和一个链接,链接是微博附图的高清无水印版下载地址。脑洞 3 :得到知乎上两人的关系图为了找到在轮子哥、四万姐的关注链上游有没有我,将知乎用户的关系链画了一张很大的有向图,并得到如下结果:关于实现,可以参考我的博客:脑洞 4 :认识一下我的工资所处水平为了找到我的工资在互联网行业处于一个什么水平,通过拉勾的几十万招聘数据重新认识了自己的水平。结论如下:脑洞 5 :不想动,用树莓派吧还在上学的时候,寒假在家。晚上躺在沙发看电视,睡前 20 分钟需要去打开电热毯,不想动,就用树莓派、继电器和 Python 实现了一个邮件控制电热毯通电、断电的程序,睡前 20 分钟发一封邮件,电热毯就开了。脑洞 6 :知乎用户整体概况不多赘述,请直接看博客吧:脑洞 7 :各式各样的爬虫大到1024 / GitHub ,小到妹子图,各式各样的网站基本全部抓过了,曾经聚合过一个网站,由于不喜欢喝茶,也停了。脑洞 8 :face知乎通过关键词检索知乎用户,包括但不限于性别、地域、个人描述等。其它用 Python 做了好多好多事情,暂时想到这些值得分享的,如果想起来,再继续更新出来吧~48551 条评论分享收藏感谢收起42170 条评论分享收藏感谢收起您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
python,练习题网站.doc 20页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
&#xe600;下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
python,练习题网站
你可能关注的文档:
··········
··········
python,练习题网站
for m in range :
for n in range:
print m,” “,n
print “ “
写程序,输出以下内容
for m in range:
for n in range:
print m,”“,n
print “ “
2. 写程序,输出以下内容
讨巧的办法就是把第1-2中的m和n互换
for m in range:
for n in range:
print n,”“,m
print “ “
3. 写程序,输出以下内容
# encoding: utf-8
@param: line_cnt 行数
for row in range:
for col in range:
print ‘%d %d\t’ % ,
print ‘‘
if __name__ == ‘__main__’:
4. 写程序,输出以下内容
# -*- coding: cp93-*-
#enconding: utf-8
@param:行数
for i in range:
for j in range:
print ‘%s*%s=%s\t’ % ,#这边的逗号很重要,有了逗号,才能不换行print’’
if __name__ == ‘__main__’:
#!/usr/bin/env
#coding: utf-8
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
2.程序源代码:
for i in range:
for j in range:
for k in range:
print i,j,k
题目:企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
2.程序源代码:
bonus1 = 100000 * 0.1
bonus= bonus1 + 100000 * 0.500075
bonus= bonus+00000 * 0.5
bonus= bonus+00000 * 0.3
bonus10 = bonus+00000 * 0.15
bonus = i * 0.1
bonus = bonus1 +
bonus = bonus+
bonus = bonus+
bonus = bonus+
bonus = bonus10 +
print ‘bonus = ‘,bonus
题目:一个整数,它加上100后是一个完全平方数,再加上268又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
的结果满足如下
正在加载中,请稍后...
21页59页20页21页16页65页27页13页31页17页}

我要回帖

更多关于 计算机语言python 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信