佛山外贸网站推广网站开发系统设计怎么写
佛山外贸网站推广,网站开发系统设计怎么写,博创网站建设团队,广州建站哪个济南兴田德润实惠吗程序运行太慢#xff0c;想要提速#xff0c;但不使用复杂的技术如 C 扩展或 JIT 编译器。 解决方案 程序优化的第一准则是“不要优化”#xff0c;第二准则是“不要优化那些不重要的部分”。基于这两个原则#xff0c;如果你的程序运行得很慢#xff0c;你得先找出影响性… 程序运行太慢想要提速但不使用复杂的技术如 C 扩展或 JIT 编译器。 解决方案 程序优化的第一准则是“不要优化”第二准则是“不要优化那些不重要的部分”。基于这两个原则如果你的程序运行得很慢你得先找出影响性能的问题所在。 多数时候我们发现程序把大量的时间花在几个热点位置比如处理数据的内层循环。一旦确认了这些热点就可以使用以下各小节中介绍的技术让程序运行得更快。 使用函数 很多人开始使用 Python 时都是用它来编写一些简单的脚本。最开始时很容易陷入只管编写代码而不重视程序结构的怪圈。例如 # somescript.pyimport sys
import csvwith open(sys.argv[1]) as f:for row in csv.reader(f):# Some kind of processingpass 一个鲜为人知的事实是像上面这样定义在全局范围内的代码比定义在函数中的代码要慢。速度的差异与局部变量与全局变量的实现机制有关涉及局部变量的操作要更快。因此如果想让程序运行得更快可以将脚本中的语句放入函数中即可 # somescript.py
import sys
import csvdef main(filename):with open(filename) as f:for row in csv.reader(f):# Some kind of processingpassmain(sys.argv[1]) 运行速度的差异与具体执行的任务有关但根据经验提升 15% ~ 30% 的情况很常见。 消除属性访问 每次使用句点操作符.来访问对象的属性都会带来开销。在底层这会触发调用特殊的方法。 通常可以用 from module import name 的导入形式以及选择性地使用绑定方法bound method来避免出现属性查询操作。我们用下面的代码片段来加以说明 import mathdef compute_roots(nums):result []for n in nums:result.append(math.sqrt(n))return result# Test
nums range(1000000)
for n in range(100):r compute_roots(nums) 当在我们的机器上测试时这个程序运行了大约 40 秒。现在将 compute_roots() 函数修改为如下形式 from math import sqrtdef compute_roots(nums):result []result_append result.appendfor n in nums:result_append(sqrt(n))return result 修改后的版本运行时间大约是 29 秒。唯一不同之处就是消除了属性访问。用 sqrt() 代替了 math.sqrt()。result.append() 方法被赋给一个局部变量 result_append然后在内部循环中使用它。 但是必须强调的是只有在频繁执行的代码中做这些修改才有意义比如在循环中。因此这种优化技术适用的场景需要经过精心挑选。 理解变量所处的位置 前述提及访问局部变量比全局变量要快。对于需要频繁访问的名称想提高运行速度可以通过尽量让这些变量尽可能成为局部变量来实现。例如 import mathdef compute_roots(nums):sqrt math.sqrtresult []result_append result.appendfor n in nums:result_append(sqrt(n))return result 在这个版本中sqrt 方法已经从 math 模块中提取出来并放置在一个局部变量中。如果运行这份代码执行时间大约是 25 秒这比上一个版本的 29 秒又有所提升。根本原因就是查找局部变量比全局变量要快。 当使用类时局部参数同样能起到提速的效果。一般来说查找像 self.name 这样的值会比访问一个局部变量要慢很多。在内层循环中将需要经常访问的属性移到局部变量中来会很划算。例如 # Slower
class SomeClass:...def method(self):for x in s:op(self.value)# Faster
class SomeClass:...def method(self):value self.valuefor x in s:op(value) 避免不必要的抽象 装饰器decorator、属性property或者描述符descriptor包装过的代码运行速度通常会变慢。参考以下代码 class A:def __init__(self, x, y):self.x xself.y ypropertydef y(self):return self._yy.setterdef y(self, value):self._y value 测试一下 from timeit import timeita A(1,2)timeit(a.x, from __main__ import a)
0.07817923510447145timeit(a.y, from __main__ import a)
0.35766440676525235使用内建的容器 内建的数据类型比如字符串、元组、列表、集合以及字典都是用 C 语言实现的速度非常快。如果需要构建自己的数据结构作为替代例如链表、二叉树等想在性能上达到内建的速度几乎不可能因此还是尽量使用内建的数据结构吧。 避免产生不必要的数据结构或者拷贝动作 有时候程序员可能会创建一些不必要的数据结构比如下面的代码 values [x for x in sequence]
squares [x*x for x in values] 也许这里的想法是首先将一些值收集到一个列表中然后使用列表推导来执行操作。不过第一个列表完全没有必要可以简单的像下面这样写 squares [x*x for x in sequence] 与此相关还要注意下那些对Python的共享数据机制过于偏执的程序所写的代码。有些人并没有很好的理解或信任Python的内存模型滥用 copy.deepcopy() 之类的函数。通常在这些代码中是可以去掉复制操作的。 讨论 在进行优化之前有必要研究一下使用的算法。选择一个复杂度为 O(n log n) 的算法要比你去调整一个复杂度为 O(n**2) 的算法所带来的性能提升要大得多。 如果优化代码势在必行那么请从整体考虑。作为一般准则不要对程序的每一个部分都去优化,因为这些修改会导致代码难以阅读和理解。你应该专注于优化产生性能瓶颈的地方比如内部循环。 还要注意一些小的优化的结果。比如下面创建字典的两种方式 a {name : AAPL,shares : 100,price : 534.22
}b dict(nameAAPL, shares100, price534.22) 后面一种写法更简洁一些你不需要在关键字上输入引号。不过如果你将这两个代码片段进行性能测试对比时会发现使用 dict() 的方式会慢了3倍。看到这个你是不是有冲动把所有使用 dict() 的代码都替换成第一种。不过聪明的程序员只会关注他应该关注的地方比如内部循环。在其他地方这点性能损失没有什么影响。 如果你的优化要求比较高本节的这些简单技术满足不了那么你可以研究下基于即时编译JIT技术的一些工具。例如PyPy 工程是 Python 解释器的另外一种实现它会分析你的程序运行并对那些频繁执行的部分生成本机机器码。它有时候能极大的提升性能通常可以接近 C 代码的速度。不过可惜的是到写这本书为止PyPy 还不能完全支持 Python3。因此这个是你将来需要去研究的。你还可以考虑下 Numba 工程 Numba 是一个在你使用装饰器来选择 Python 函数进行优化时的动态编译器。这些函数会使用LLVM被编译成本地机器码。它同样可以极大的提升性能。但是跟 PyPy 一样它对于 Python 3 的支持现在还停留在实验阶段。 最后我引用John Ousterhout说过的话作为结尾“最好的性能提升就是从不工作转变为可以工作”。直到你真的需要优化的时候再去考虑它。确保你程序正确的运行通常比让它运行更快要更重要一些至少开始是这样的。 参考 《Python Cookbook》第三版http://python3-cookbook.readthedocs.org/zh_CN/latest/ 关于简说基因 生信平台Galaxy中国UseGalaxy.cn致力于打造中国人的云上生物信息基础设施。大量在线工具免费使用。无需安装用完即走。活跃的用户社区随时交流使用心得。生信培训简说基因的生信培训班荣获学员的一致好评。如果你也对生物信息学感兴趣欢迎来跟简说基因学真生信。生信分析我们能够承接所有 NGS 组学数据分析业务包括但不限于 WGS / WES / RNA-seq 等。基因组组装、注释以及各种重测序业务都可以与简说基因合作。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92080.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!