让你的Python提速30%!(下)
前文回首:让你的Python提速30%!(上) 使它更快此刻进入风趣的部门。让我们帮您的Python措施运行得更快。我(根基上)不会向您展示一些可以或许神奇地办理机能题目的黑客、能力和代码片断。这更多的是关于一样平常的设法和计策,当行使时,它们可以对机能发生庞大的影响,在某些环境下可以进步30%的速率。 行使内置数据范例这一点很明明。内置数据范例很是快,出格是与我们的自界说范例(如树或链接列表)对比。这首要是由于内置代码是用C实现的,在用Python编写代码时,我们在速率上无法真正匹配。 缓存/影象lru_cache用一个简朴的例子来一再一下: import functools import time # caching up to 12 different results @functools.lru_cache(maxsize=12) def slow_func(x): time.sleep(2) # Simulate long computation return x slow_func(1) # ... waiting for 2 sec before getting result slow_func(1) # already cached - result returned instantaneously! slow_func(3) # ... waiting for 2 sec before getting result 上面的函数行使time.sleep模仿沉重的计较。当第一次用参数1挪用时,它守候2秒,然后才返回功效。再次挪用时,功效已被缓存,因此它跳过函数体并当即返回功效。 行使局部变量这与在每个浸染域中查找变量的速率有关。我编写每个浸染域,由于它不只仅是行使局部变量和全局变量。现实上,查找速率乃至在函数中的局部变量(最快)、类级属性(譬喻self.name-slower)和全局(譬喻time.time(最慢))之间也存在差别。 你可以通过行使看起来不须要的(直接的无用的)使命来进步机能,好比: # Example #1 class FastClass: def do_stuff(self): temp = self.value # this speeds up lookup in loop for i in range(10000): ... # Do something with `temp` here # Example #2 import random def fast_function(): r = random.random for i in range(10000): print(r()) # calling `r()` here, is faster than global random.random()
行使函数这好像有悖常理,由于挪用函数会将更多的对象放到仓库中,并从函数返回中发生开销,但这与前面的一点有关。假如只将整个代码放在一个文件中而不将其放在函数中,则会由于全局变量而慢得多。因此,只需将整个代码包装在main函数中并挪用一次,就可以加速代码的速率,如下所示: def main(): ... # All your previously global code main() 不会见属性另一个也许会减慢措施速率的是点运算符(.),它在会见工具属性时行使。此运算符行使_getattribute__触发字典查找,这会在代码中发生特另外开销。那么,我们怎样才气真正停止(限定)行使它呢? # Slow: import re def slow_func(): for i in range(10000): re.findall(regex, line) # Slow! # Fast: from re import findall def fast_func(): for i in range(10000): findall(regex, line) # Faster! 谨防字符串在轮回中行使譬喻module(%s)或.format()运行时,对字符串的操纵也许会很是慢。我们尚有什么更好的选择?按照Raymond Hettinger最近的推文,我们独一应该行使的是f-string,它是最可读、最简捷、最快的要领。因此,按照这条推文,这是你可以行使的要领列表-从最快到最慢: f'{s} {t}' # Fast! s + ' ' + t ' '.join((s, t)) '%s %s' % (s, t) '{} {}'.format(s, t) Template('$s $t').substitute(s=s, t=t) # Slow! 天生器自己并不是更快的,由于它们应承耽误计较,这节减了内存而不是时刻。可是,节减的内存也许会导致措施现实上运行得更快。奈何?好吧,假如您有一个大型数据集,而且不行使天生器(迭代器),那么数据也许会溢出cpu L1缓存,这将明显减慢在内存中查找值的速率。 说到机能,很重要的一点是CPU可以生涯它正在处理赏罚的全部数据,尽也许靠近地生涯在缓存中。你可以看Raymond Hettingers的演讲,他提到了这些题目。 结论优化的第一条法则是不要这样做。可是,假如你真的必要的话,我但愿这几条提议能帮到你。可是,在优化代码时要警惕,由于它也许会导致代码难以阅读,因此难以维护,这也许会高出优化的甜头。 原文链接:https://towardsdatascience.com/making-python-programs-blazingly-fast-c1cd79bd1b32 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |