加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

让你的Python提速30%!(下)

发布时间:2020-01-26 06:26:37 所属栏目:运营 来源:站长网
导读:前文回首:让你的Python提速30%!(上) 使它更快 此刻进入风趣的部门。让我们帮您的Python措施运行得更快。我(根基上)不会向您展示一些可以或许神奇地办理机能题目的黑客、能力和代码片断。这更多的是关于一样平常的设法和计策,当行使时,它们可以对机能发生巨

前文回首:让你的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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读