精华内容
下载资源
问答
  • 开始优化前,写一个高级测试来证明原来代码很慢。...用合适的方法来为你的Python代码加速很有意思,但是注意不要破坏了本身的逻辑。可读的代码比运行速度更重要。先把它缓存起来再进行优化其实更好。

    开始优化前,写一个高级测试来证明原来代码很慢。你可能需要采用一些最小值数据集来复现它足够慢。通常一两个显示运行时秒的程序就足够处理一些改进的地方了。

    有一些基础测试来保证你的优化没有改变原有代码的行为也是很必要的。你也能够在很多次运行测试来优化代码的时候稍微修改这些测试的基准。

    那么现在,我们来来看看优化工具把。

    简单的计时器

    计时器很简单,这是一个最灵活的记录执行时间的方法。你可以把它放到任何地方并且副作用很小。运行你自己的计时器非常简单,并且你可以将其定制,使它以你期望的方式工作。例如,你个简单的计时器如下:

    import time

    def timefunc(f):

    def f_timer(*args, **kwargs):

    start = time.time() result = f(*args, **kwargs)

    end = time.time() print f.__name__, "took", end - start, "time" return result return f_timer def get_number(): for x in xrange(5000000): yield x @timefuncdef expensive_function(): for x in get_number(): i = x ^ x ^ x return "some result!" # prints "expensive_function took 0.72583088875 seconds" result = expensive_function()

    当然,你可以用上下文管理来让它功能更加强大,添加一些检查点或者一些其他的功能:

    import time class timewith(): def __init__(self, name=""): self.name = name self.start = time.time() @property def elapsed(self): return time.time() - self.start def checkpoint(self, name=""): print "{timer} {checkpoint} took {elapsed} seconds".format( timer=self.name, checkpoint=name, elapsed=self.elapsed, ).strip() def __enter__(self): return self def __exit__(self, type, value, traceback): self.checkpoint("finished") pass def get_number(): for x in xrange(5000000): yield x def expensive_function(): for x in get_number(): i = x ^ x ^ x return "some result!" # prints something like: # fancy thing done with something took 0.582462072372 seconds # fancy thing done with something else took 1.75355315208 seconds # fancy thing finished took 1.7535982132 seconds with timewith("fancy thing") as timer: expensive_function() timer.checkpoint("done with something") expensive_function() expensive_function() timer.checkpoint("done with something else") # or directly timer = timewith("fancy thing") expensive_function() timer.checkpoint("done with something")

    计时器还需要你做一些挖掘。包装一些更高级的函数,并且确定瓶颈在哪,然后深入的函数里,能够不停的重现。当你发现一些不合适的代码,修复它,然后测试一遍以确认它被修复了。

    一些小技巧:不要忘了好用的timeit模块!它对小块代码做基准测试而不是实际调查更加有用。

    Timer 优点:很容易理解和实现。也非常容易在修改后进行比较。对于很多语言都适用。

    Timer 缺点:有时候对于非常复杂的代码有点过于简单,你可能会花更多时间放置或移动引用代码而不是修复问题!

    内建优化器

    启用内建的优化器就像是用一门大炮。它非常强大,但是有点不太好用,使用和解释起来比较复杂。

    你可以了解更多关于profile模块的东西,但是它的基础是非常简单的:你能够启用和禁用优化器,而且它能打印所有的函数调用和执行时间。它能给你编译和打印出输出。一个简单的装饰器如下:

    import cProfile def do_cprofile(func): def profiled_func(*args, **kwargs): profile = cProfile.Profile() try: profile.enable() result = func(*args, **kwargs) profile.disable() return result finally: profile.print_stats() return profiled_func def get_number(): for x in xrange(5000000): yield x @do_cprofiledef expensive_function(): for x in get_number(): i = x ^ x ^ x return "some result!" # perform profiling result = expensive_function()

    在上面代码的情况下,你应该看到有些东西在终端打印出来,打印的内容如下:

    5000003 function calls in 1.626 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 5000001 0.571 0.000 0.571 0.000 timers.py:92(get_number) 1 1.055 1.055 1.626 1.626 timers.py:96(expensive_function) 1 0.000 0.000 0.000 0.000 {method "disable" of "_lsprof.Profiler" objects}

    你可以看到,它给出了不同函数的调用次数,但它遗漏了一些关键的信息:是哪个函数让运行这么慢?

    可是,这对于基础优化来说是个好的开始。有时候甚至能用更少的精力找到解决方案。我经常用它来在深入挖掘究竟是哪个函数慢或者调用次数过多之前来调试程序。

    内建优点:没有额外的依赖并且非常快。对于快速的高等级检查非常有用。

    内建缺点:信息相对有限,需要进一步的调试;报告有点不太直接,尤其是对于复杂的代码。

    Line Profiler

    如果内建的优化器是一门大炮,那么line profiler可以看作是一门离子加农炮。它非常的重量级和强大。

    在这个例子里,我们会用非常棒的line_profiler库。为了容易使用,我们会再次用装饰器包装一下,这种简单的方法也可以防止把它放在生产代码里。

    try: from line_profiler import LineProfiler def do_profile(follow=[]): def inner(func): def profiled_func(*args, **kwargs): try: profiler = LineProfiler() profiler.add_function(func) for f in follow: profiler.add_function(f) profiler.enable_by_count() return func(*args, **kwargs) finally: profiler.print_stats() return profiled_func return inner except ImportError: def do_profile(follow=[]): "Helpful if you accidentally leave in production!" def inner(func): def nothing(*args, **kwargs): return func(*args, **kwargs) return nothing return inner def get_number(): for x in xrange(5000000): yield x @do_profile(follow=[get_number]) def expensive_function(): for x in get_number(): i = x ^ x ^ x return "some result!" result = expensive_function()

    如果你运行上面的代码,你就可以看到一下的报告:

    Timer unit: 1e-06 s File: test.py Function: get_number at line 43Total time: 4.44195 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 43 def get_number(): 44 5000001 2223313 0.4 50.1 for x in xrange(5000000): 45 5000000 2218638 0.4 49.9 yield x File: test.py Function: expensive_function at line 47Total time: 16.828 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 47 def expensive_function(): 48 5000001 14090530 2.8 83.7 for x in get_number(): 49 5000000 2737480 0.5 16.3 i = x ^ x ^ x 50 1 0 0.0 0.0 return "some result!"

    你可以看到,有一个非常详细的报告,能让你完全洞悉代码运行的情况。不想内建的cProfiler,它能计算话在语言核心特性的时间,比如循环和导入并且给出在不同的行花费的时间。

    这些细节能让我们更容易理解函数内部。如果你在研究某个第三方库,你可以直接将其导入并加上装饰器来分析它。

    一些小技巧:只装饰你的测试函数并将问题函数作为接下来的参数。

    Line Profiler 优点:有非常直接和详细的报告。能够追踪第三方库里的函数。

    Line Profiler 缺点:因为它会让代码比真正运行时慢很多,所以不要用它来做基准测试。这是额外的需求。

    总结和最佳实践

    你应该用更简单的工具来对测试用例进行根本的检查,并且用更慢但能显示更多细节的line_profiler来深入到函数内部。

    九成情况下,你可能会发现在一个函数里循环调用或一个错误的数据结构消耗了90%的时间。一些调整工具是非常适合你的。

    如果你仍然觉得这太慢,而是用一些你自己的秘密武器,如比较属性访问技术或调整平衡检查技术。你也可以用如下的方法:

    1.忍受缓慢或者缓存它们

    2.重新思考整个实现

    3.更多使用优化的数据结构

    4.写一个C扩展

    注意了,优化代码是种罪恶的快感!用合适的方法来为你的Python代码加速很有意思,但是注意不要破坏了本身的逻辑。可读的代码比运行速度更重要。先把它缓存起来再进行优化其实更好。

    展开全文
  • 我觉得Python与任何带有“大型”二字的程序,都是相斥的,甚至“中型”都很难触及。只适合用于“小型”项目,且最好无需维护,用完即丢。否则我会尽量避免使用Python。第一次接触Python,到现在也快十年了,按说也算...

    我觉得Python与任何带有“大型”二字的程序,都是相斥的,甚至“中型”都很难触及。只适合用于“小型”项目,且最好无需维护,用完即丢。否则我会尽量避免使用Python。

    第一次接触Python,到现在也快十年了,按说也算一名老Pythoner,可随着Python越来越火,我对它的关注却越来越少了。因为我的工作中,它一直像个替补球员,常年坐在冷板凳上,很少有上场的机会。当然,如果我刻意为之,它可以常常上场,但我的项目,会变得非常不健壮,甚至可能因为部分代码难以维护,而导致整个项目烂尾。

    当然,在有足够把握的前提下,换Python上场,通常也并不会影响最终结果。可这样做的理由又是什么呢?莫非只是为了给维护工作增加难度?

    下面这句话也许有些极端,但很多时候我心中确实就是这么想的:“在构建大型程序之时,所有动态语言都是垃圾”。

    如果把静态语言(Java,C#,C++)比做汽车,那动态语言就像是自行车,如果你每天去门口的菜市场买菜,开车会显得很麻烦。踩离合,挂档,松离合,踩油门,刚走了两三米,堵了,于是又是一遍踩离合,挂档,松离合,踩油门。。。。从任何角度看自行车都简单方便的多。所以如果你每天外出,都只去菜市场,从来没去过更远的地方,自行车当然是世界上最好的交通工具。汽车的存在,似乎根本就是多余的,你想反驳两句,人家只要一句话就能把你堵回来:“我既然可以骑到菜市场,当然就可以骑到全世界”。

    久而久之,这几乎就成了真理,所以静态语言在这些人眼中,只是在原本完美的语句上面,如强迫症一般,硬加了一堆完全没必要的int,float,string。。。。。。纯属自讨没趣,离合,油门,方向盘,搞得这么臃肿?安两个脚蹬子一下全搞定,要用什么样的词汇形容这种感觉?优雅!

    于是通过口耳相传,这个划时代的脚蹬子,成为了当今最火的网红,拥有了最高的逼格,肩负着改变世界的使命。。。。。。那些执着于离合,油门,方向盘的,都是一群顽冥不化的老顽固。整个行业的未来,当然是要靠脚蹬子来推动的。为什么?因为优雅!

    跑1米?我到了,汽车连动都没动。

    跑10米?我到了,汽车还是一动没动。

    跑100米?我到了,汽车才走了一米。

    果然自行车完胜啊,无论怎么比都完虐汽车。

    而等到某一天,你真的决定出一趟远门,依然骑着自行车出门了。骑到半路两腿发麻,于是放弃出远门的计划,回家躺着去了。之后把一切归咎于自己踩车蹬子的水平不够,甚至根本不会考虑用汽车试试,因为汽车不优雅!

    确实有些大型项目中大量使用了Python,但这能说明什么呢?不是每年都有骑行爱好者,骑着自行车环游世界吗?

    可毕竟对于绝大多数人来说,骑自行车出门,十来公里,就会两腿发麻。而开车出门,百公里毫无压力,这就是事实啊。

    真的比较开发效率,微型程序,Python当然比java强。但也仅此而已吧?逛菜市场若是输给汽车,你还有啥存在价值?若是web方向,大概php更有效率吧?连菜篮子都是现成的,离开菜市场,就只能进废品站了。桌面程序,还有比Delphi或VB开发效率更高的?

    大中型程序,自.Net Core发布之后,C#还真是棒。虽然刚刚起步,远不如Java主流,但确实好用。语法骚,性能棒,配置方便,IDE也牛逼。以前用Java几个小时才能写完一套基础CRUD代码。改用.Net Core之后才知道,只要配置好数据库上下文,这些基础CRUD代码根本不用手写,可以用Visual Studio直接生成。不仅大幅减少工作量,还能避免人为疏失产生的BUG,啥叫生产力?单从技术面考虑,.NET Core能以不太高的学习成本,实现巨大的技术回报,大概是目前主流语言中性价比最高的了。而且项目越大,发现的优点越多。

    Java可能确实老了,我也越来越不喜欢它了。框架从ssh换成了ssm,IDE也从eclips变成了idea,好像是一直在进步。但实际生产力还是跟十几年前毫无差别。尤其被那个三天两头跑法院,以打官司闻名天下的甲骨文公司收购之后,Java就注定会一直走下坡路。毕竟甲骨文的心思早已不在Java本身,而在于Java所能产生出的诉讼赔偿金。按照甲骨文公司的行事风格,Java在法律圈的寿命,或许会比在IT圈更长。

    如果将来取代Java的是C#,那当然最好,说明我押对了宝。如果不是的话,没关系,至少我还可以学。而无论那门将会取代Java的语言是什么,至少可以确定,它一定是静态语言。

    无论再时髦的自行车,赋予了再多噱头,就算换上镶钻的车把,镀金的车圈,也依然只是辆自行车,如何取代一辆稍显破旧,但功能完好的帕萨特?

    展开全文
  • http://www.zhihu.com/question/22191088
    http://www.zhihu.com/question/22191088
    
    展开全文
  • 我觉得Python与任何带有“大型”二字的程序,都是相斥的,甚至“中型”都很难触及。只适合用于“小型”项目,且最好无需维护,用完即丢。否则我会尽量避免使用Python。第一次接触Python,到现在也快十年了,按说也算...

    我觉得Python与任何带有“大型”二字的程序,都是相斥的,甚至“中型”都很难触及。只适合用于“小型”项目,且最好无需维护,用完即丢。否则我会尽量避免使用Python。

    第一次接触Python,到现在也快十年了,按说也算一名老Pythoner,可随着Python越来越火,我对它的关注却越来越少了。因为我的工作中,它一直像个替补球员,常年坐在冷板凳上,很少有上场的机会。当然,如果我刻意为之,它可以常常上场,但我的项目,会变得非常不健壮,甚至可能因为部分代码难以维护,而导致整个项目烂尾。

    当然,在有足够把握的前提下,换Python上场,通常也并不会影响最终结果。可这样做的理由又是什么呢?莫非只是为了给维护工作增加难度?

    下面这句话也许有些极端,但很多时候我心中确实就是这么想的:“在构建大型程序之时,所有动态语言都是垃圾”。

    如果把静态语言(Java,C#,C++)比做汽车,那动态语言就像是自行车,如果你每天去门口的菜市场买菜,开车会显得很麻烦。踩离合,挂档,松离合,踩油门,刚走了两三米,堵了,于是又是一遍踩离合,挂档,松离合,踩油门。。。。从任何角度看自行车都简单方便的多。所以如果你每天外出,都只去菜市场,从来没去过更远的地方,自行车当然是世界上最好的交通工具。汽车的存在,似乎根本就是多余的,你想反驳两句,人家只要一句话就能把你堵回来:“我既然可以骑到菜市场,当然就可以骑到全世界”。

    久而久之,这几乎就成了真理,所以静态语言在这些人眼中,只是在原本完美的语句上面,如强迫症一般,硬加了一堆完全没必要的int,float,string。。。。。。纯属自讨没趣,离合,油门,方向盘,搞得这么臃肿?安两个脚蹬子一下全搞定,要用什么样的词汇形容这种感觉?优雅!

    于是通过口耳相传,这个划时代的脚蹬子,成为了当今最火的网红,拥有了最高的逼格,肩负着改变世界的使命。。。。。。那些执着于离合,油门,方向盘的,都是一群顽冥不化的老顽固。整个行业的未来,当然是要靠脚蹬子来推动的。为什么?因为优雅!

    跑1米?我到了,汽车连动都没动。

    跑10米?我到了,汽车还是一动没动。

    跑100米?我到了,汽车才走了一米。

    果然自行车完胜啊,无论怎么比都完虐汽车。

    而等到某一天,你真的决定出一趟远门,依然骑着自行车出门了。骑到半路两腿发麻,于是放弃出远门的计划,回家躺着去了。之后把一切归咎于自己踩车蹬子的水平不够,甚至根本不会考虑用汽车试试,因为汽车不优雅!

    确实有些大型项目中大量使用了Python,但这能说明什么呢?不是每年都有骑行爱好者,骑着自行车环游世界吗?

    可毕竟对于绝大多数人来说,骑自行车出门,十来公里,就会两腿发麻。而开车出门,百公里毫无压力,这就是事实啊。

    真的比较开发效率,微型程序,Python当然比java强。但也仅此而已吧?逛菜市场若是输给汽车,你还有啥存在价值?若是web方向,大概php更有效率吧?连菜篮子都是现成的,离开菜市场,就只能进废品站了。桌面程序,还有比Delphi或VB开发效率更高的?

    大中型程序,自.Net Core发布之后,C#还真是棒。虽然刚刚起步,远不如Java主流,但确实好用。语法骚,性能棒,配置方便,IDE也牛逼。以前用Java几个小时才能写完一套基础CRUD代码。改用.Net Core之后才知道,只要配置好数据库上下文,这些基础CRUD代码根本不用手写,可以用Visual Studio直接生成。不仅大幅减少工作量,还能避免人为疏失产生的BUG,啥叫生产力?单从技术面考虑,.NET Core能以不太高的学习成本,实现巨大的技术回报,大概是目前主流语言中性价比最高的了。而且项目越大,发现的优点越多。

    Java可能确实老了,我也越来越不喜欢它了。框架从ssh换成了ssm,IDE也从eclips变成了idea,好像是一直在进步。但实际生产力还是跟十几年前毫无差别。尤其被那个三天两头跑法院,以打官司闻名天下的甲骨文公司收购之后,Java就注定会一直走下坡路。毕竟甲骨文的心思早已不在Java本身,而在于Java所能产生出的诉讼赔偿金。按照甲骨文公司的行事风格,Java在法律圈的寿命,或许会比在IT圈更长。

    如果将来取代Java的是C#,那当然最好,说明我押对了宝。如果不是的话,没关系,至少我还可以学。而无论那门将会取代Java的语言是什么,至少可以确定,它一定是静态语言。

    无论再时髦的自行车,赋予了再多噱头,就算换上镶钻的车把,镀金的车圈,也依然只是辆自行车,如何取代一辆稍显破旧,但功能完好的帕萨特?

    展开全文
  • Python 的开发效率真的比 Java高吗

    千次阅读 2019-05-20 10:40:52
    Python 的开发效率真的比 Java高吗?】 真的比Java高很高。 几个例子。 爬虫领域,几年前就用Scrapy抓百度,新浪,股吧等各种东西。 五分钟写好一个小爬虫,爽到暴有没有?当年我就是靠教人写爬虫。。。才...
  • 本人python菜鸟,需要处理一个有2000多万条的excel数据表格,所以希望使用多进程编程实现提高效率,但是找不到适合的例子可以参考,特意来询问大佬们。
  • 这几年随着AI人工智能行业的快速发展,诸如智能机器人,无人驾驶等新鲜产物进入大众的视野,而人工智能行业首选的编程语言Python成为学习的重点,相较于其他编程语言来说Python语言简洁、开发效率高、可移植性强,...
  • Python在近几年的发展是势不可挡的,越来越多的领域都能够用到Python语言,到现在的政府、企业,对于...对于想要快速转行或者没有基础,零基础的人员来说,选择Python培训班学习是最无疑的选择了,也是最高效率的...
  • Python在近几年的发展是势不可挡的,越来越多的领域都能够用到Python语言,到现在的政府、企业,对于...对于想要快速转行或者没有基础,零基础的人员来说,选择Python培训班学习是最无疑的选择了,也是最高效率的...
  • 半信半疑我加了一个卖课的微信,她跟我说,学了python就能轻松搞定各种可视化报表,实现自动化,能转行干程序员,工作好找工资,而且python入门简单,0基础也能学....听起来python是个万能语言,于是我二话不说就...
  • 本文来介绍下,多线程是如何工作的,多线程就一定效率高吗,本文可以告诉你不一定。 1. 先来了解Python解释器执行代码方式  Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在...
  • 由于代码模拟的速度和效率,所以可以批量和动态获取我们想要的信息。比如抢票软件就是一直用代码访问12306网站获取余票信息,一有余票立马使用代码进行模拟购买。二、网络爬虫的分类通用网络爬虫。又称全...
  • (推荐学习:Python视频教程)对于同学们来说,如果身在北上广的话,那么可选择性以及进大公司的概率要大太多,找工作的效率也要很多。因为大城市,尤其是一线城市,是全中国公司质量和密...
  • 在学完风程基础的体验关卡之后,我被风变设浸入式互动的模式所吸引,在这种学习模式下,注意力非常集中,效率也很,而且趣味十足。学习解决编程的各种实例过程中,我们可以根据项目设计的要求,逐步拆解问题,这些...
  • 1、就业岗位多,人才就业率高:Python语言更其他的编程语言不通,该语言简单优美、开发效率高,所以受到了不少企业的喜欢,学习Python语言后可以从事web开发、云计算、人工智能、科学运算等方向,而且Pytho...
  • 小白,最近在学习字符串匹配,...但经过测试发现还是python内置的find函数效率最高,包括用 in 判断是否存在子串也是最快的 ,请问在字符串精准匹配这方面python还有更好的实现方法吗。</p>

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 237
精华内容 94
关键字:

python效率高吗

python 订阅