网星软件吧 关注:6贴子:149
  • 1回复贴,共1

如果运行速度对你真的很重要?Python怎么搞?

只看楼主收藏回复

上述观点的论调听上去像认为优化和速度根本不重要。但是事实是,许多时候运行时效率至关重要。一个例子是,你的网络应用有一个特定的端点需要相当长的时间来响应请求。同时你知道它需要有多快,也知道它要被优化到什么程度。
在这个例子中,发生了下面两件事:
我们关注到某个运行慢的端点。
我们认为它慢,因为我们了解什么是足够快,并且它没能达到这个指标。
我们不必在应用中对每个服务进行细节调优。每个服务只需要能“足够快”来满足用户的需求就够了。用户会发现某个端点花费了几秒时间返回,但是他们并不会注意到你把一个 35 毫秒的请求优化到了 25 毫秒。你只需要达到“足够好”就可以了。免责声明:不得不说一些应用,如实时拍卖应用,确实需要细节调优,能提升一毫秒算一毫秒。但是这是一个特例,而不是业界的规则。
为了弄清如何优化某个端点,第一步你需要对你的代码进行性能分析,并尝试整理出其中的瓶颈。归根到底:
任何不考虑瓶颈的调优都是幻想。—— Gene Kim
如果你的优化并不解决瓶颈,那你就是在浪费你的时间,而且还不能解决真正地问题。不解决瓶颈,你就不会在性能上得到显著的提升。如果你尝试着在了解瓶颈前优化,你就像在和你的代码在玩打地鼠的游戏。在排查和确定瓶颈前优化代码也是“不成熟优化”的表现。Donald Knuth 常被引用下面的观点,虽然他本人称这也是从其他人那儿听来的:
不成熟的优化是万恶之源。
Donald Knuth 在一次关于维护代码库的讨论中进行了下面的完整描述:
我们应该忘记那些小的性能提升,这占了 97% 的时间:不成熟的优化是万恶之源。但同时我们也不能放过那至关重要的 3%。
换句话来说,大部分时间,你不应该关心代码的优化。它们通常已经足够好了。如果没有能达到标准,我们应该只需要改变那 3% 的代码。你并不会因为你的代码使用一个 if 替代了一个方法,得到几毫秒的性能提升而获得任何奖励。只有在分析之后再进行优化。


IP属地:四川1楼2018-01-29 16:13回复
    不成熟的优化包含盲目调用某个更快的方法,或使用一个特定的数据结构只因为其总体上更快。计算机科学认为两个方法或算法有一样的渐进增长(或时间复杂度),那么就可以认为它们性能是相同的,就算其中之一比另一个慢两倍。计算机的速度太快,算法在计算上的增长,如数据或使用量的增长比算法本身重要得多。
    换而言之,如果你有两个 O(log n) 的方法,一个是另一个速度的两倍,这之间的差别根本无关紧要。随着数据量的增长,它们都会以相同的速度变慢。这也就是为什么不成熟的优化是万恶之源,它会浪费我们的时间,最终却在提升性能上帮不上我们什么忙。
    就时间复杂度而言,你可以认为用任何的语言写你的程序的复杂度都是 O(n) 的,其中 n 是代码的行数或指令个数。同一指令的增长速率都是相同的。所以一个语言或运行时的快慢并不重要,就渐进增长而言,所有语言都是等价的。在这个逻辑下,你可以认为,因为某个语言速度快而选择其为开发你应用的语言是不成熟优化的一种体现。你不应该主观地判断某个语言快而不去进行衡量、不去了解将会遇到的瓶颈。
    因为某个语言速度快而选择其为开发你应用的语言是不成熟优化的一种体现。


    IP属地:四川2楼2018-01-29 16:13
    回复