我一直在研究InterviewStreet.com上的编码挑战之一,并且遇到了一些效率问题。谁能建议我可以在哪里更改代码以使其更快,更有效?
这是代码
如果您有兴趣,这是问题陈述
如果您的问题是关于一般地优化python代码(我认为应该是;),那么可以做各种各样的测试工作,但是首先:
您可能不应该过分地优化python代码! 如果您要使用最快的算法来解决问题,而python的处理速度不够快,则可能应该使用其他语言。
就是说,您可以采用几种方法(因为有时候,您确实确实想使python代码更快):
有很多分析python代码的方法,但是我将提到两种:(cProfile
或profile
)module和PyCallGraph
。
这是您实际上应该使用的方法,尽管解释结果可能会有些令人生畏。它通过记录何时进入或退出每个函数以及调用函数是什么(以及跟踪异常)来进行记录。
您可以像这样在cProfile中运行一个函数:
import cProfile
cProfile.run('myFunction()', 'myFunction.profile')
然后查看结果:
import pstats
stats = pstats.Stats('myFunction.profile')
stats.strip_dirs().sort_stats('time').print_stats()
这将向您显示大部分时间都花在哪些功能上。
PyCallGraph
提供了一种 最漂亮
,也可能是最简单的方法来分析python程序-这是了解程序时间的很好的入门指南,但是却增加了执行开销
运行pycallgraph:
pycallgraph graphviz ./myprogram.py
简单!您会得到一个png图形图像作为输出(也许过一会儿…)
如果您要尝试在python中执行某个已经存在的模块(甚至在标准库中),请改用该模块!
大多数标准库模块都是用C语言编写的,它们的执行速度比对等搜索(例如,bisection搜索)要快数百倍。
解释器将为您做一些事情,例如循环。真?是! 您可以使用map
,reduce
以及filter
关键字显著加快紧凑循环:
考虑:
for x in xrange(0, 100):
doSomethingWithX(x)
vs:
map(doSomethingWithX, xrange(0,100))
显然,这 可能 会更快,因为解释器只需要处理一个语句即可,而不是两个,但这有点含糊……实际上,这样做有两个原因:
在for循环中,每次循环python都要检查doSomethingWithX
函数的确切位置!即使是缓存,这也有些开销。
(请注意,本节实际上是关于微小的优化,您不应该让它们影响您的常规可读编码风格!)如果您来自使用c或Fortran之类的编译语言进行编程的背景,那么关于不同的python语句的性能可能令人惊讶:
try:
ing便宜,if
ing昂贵如果您有这样的代码:
if somethingcrazy_happened:
uhOhBetterDoSomething()
else:
doWhatWeNormallyDo()
而doWhatWeNormallyDo()
将抛出如果有什么疯狂的事例外,那么这将是更快的这样的安排你的代码:
try:
doWhatWeNormallyDo()
except SomethingCrazy:
uhOhBetterDoSomething()
为什么?很好,口译员可以直接潜入并开始做您通常的工作;在第一种情况下, 每次 执行if语句 时
,解释器都必须查找一个符号,因为该名称可能引用自上次执行该语句以来的其他内容!(和名称查找,特别是如果somethingcrazy_happened
是global
可以的话)。
由于名称查找的开销,最好在函数中缓存全局值,然后将简单的布尔测试烘烤到这样的函数中:
未优化的功能:
def foo():
if condition_that_rarely_changes:
doSomething()
else:
doSomethingElse()
优化的方法而不是使用变量,而是利用了解释器始终在函数上进行名称查找的事实!
条件成立时:
foo = doSomething # now foo() calls doSomething()
当条件变为假时:
foo = doSomethingElse # now foo() calls doSomethingElse()
PyPy是用python编写的python实现。当然,这意味着它将无限慢地运行代码吗?好吧,不。PyPy实际上使用即时编译器(JIT)运行python程序。
如果您不使用任何外部库(或者您使用的外部库与PyPy兼容),则这是一种(几乎可以肯定)加快程序中重复任务的极其简便的方法。
基本上,JIT可以生成代码,将做什么Python解释器会,但 多 快,因为它是一个单一的情况下产生的,而不是来处理每一个可能的法律Python表达式。
当然,您应该首先考虑的是改进算法和数据结构,并考虑诸如缓存之类的事情,或者甚至是否首先需要做很多事情,但是无论如何:
python.org Wiki的此页面提供了许多有关如何加快python代码速度的信息,尽管其中有些过时了。
这是BDFL自己关于优化循环的主题。
即使我从有限的经验中也错过了很多东西,但是这个答案已经足够长了!
这一切都是基于我最近对某些python代码的经验,这些代码 还不够快
,我想再次强调一点,我真的不认为我建议的任何内容实际上是一个好主意,有时但是,您必须…
Donald Knuth "过早的优化是一切罪恶的根源" 本章处理用策略让Python代码跑得更快。 先决条件 line_profiler gprof2dot 来自dot实用程序 2.4.1 优化工作流 让它工作起来:用简单清晰的方式来写代码。 让它可靠的工作:写自动的测试案例,以便真正确保你的算法是正确的,并且如果你破坏它,测试会捕捉到。 通过剖析简单的使用案例找到瓶颈,并且加速这些瓶颈,寻找更
有没有代码写的漂亮的大佬,看看这个代码怎么优化,一直写前端的,突然被叫去搞java,发现很多技术都不太相同,例如动态的key去调用之类,导致写出这样的恶心代码,自己都看不下去了 明明js可以写的这么短小优雅,java有没有办法做到这样子的呢
我想写一个模拟 DNF 装备增幅的程序,通过多次样本执行得到平均每件增幅 10 装备需要增幅多少次。装备 +4 之前不会失败,+4 之后会失败且失败后还会掉级,具体如下图所示: 公会秘药和普雷宠物会额外增加每次增幅的成功率 1% 和 4%,所以一共分了三种情况。 我最开始用 js 写了一版: 后来想到我刚学了 rust,不如练练手,而且 rust 很快,于是又写了一版: 然而实际上 rust 代码
本文向大家介绍简单了解python代码优化小技巧,包括了简单了解python代码优化小技巧的使用技巧和注意事项,需要的朋友参考一下 对比以下两种写法,思考一下为何可以这样写。 成绩在 [0,50)、[50,60)、[60,80)、[80,100)、100、其它 80 <= score < 100 为何可以写成 score >= 80 ? 上一条语句不满足时往下执行,这时 score <100 就不
问题内容: Python可以在优化模式(-O)下运行脚本,该脚本可以关闭诸如assert之类的调试,并且如果我记得还可以删除文档字符串。我没有看到它真正使用过,也许这只是过去时代的产物。正在使用吗?做什么的? 为什么在Python 3中没有删除这个无用的东西? 问题答案: 如果您分发仅包含文件的任何存档形式,它将节省少量内存和少量磁盘空间。(如果您使用很多,并且可能在复杂的条件下使用,那么节省下来
因此,通常关于通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你聪明”。我明白了。 但是,我注意到优化的线性代数库(例如ACML)可以比标准编译库实现2到5倍的性能改进。例如,在我的8核机器上,与现有的单线程BLAS实现相比,优化的矩阵乘法运行速度快了30倍以上,这意味着,在考虑了由于使用所有内核而提高的8倍之后,仅仅通过优化仍然可以提高4倍。 所以在我看来,优化的汇编代码确实可以带来巨大的
我正在为MasterMind写一个求解器,其中我必须接受一个猜测和一个答案,并返回一些黑白钉子的数量表示,其中一个黑色钉子代表正确点的正确颜色,一个白色钉子代表不正确点的正确颜色。我必须运行这段代码大约200万次迭代,所以它需要尽可能快。目前最大的时间下沉是拆分和索引调用,但我不知道如何删除它们。关于如何在保持其功能的同时使代码运行得更快,有什么想法吗? 以确保清晰度。我的输入是用空格分隔的四种颜
JavaScript代码优化 1、慎用全局变量 为什么要慎用全局变量原因如下 1、全局变量定义在全局执行上下文,是所有作用域链的顶端 2、全局执行上下文一直存在于上下文执行站,直到程序退出 3、如果某个局部作用域出现了同名变量则会遮蔽或污染全局 2、缓存全局变量 其实就是在程序执行过程中,将使用中无法避免的全局变量缓存到局部 代码演示如下 1、普通写法: function getBt