FuncTools:一个被低估的Python包


欢迎关注 “小白玩转Python”,发现更多 “有趣”

引言

Python 的基础实际上是相当广泛的,包括许多强力的工具,以应对各种编程挑战。本文我们来介绍一下 functools 这个模块,这是一个非常强大的模块,可以通过使用简单和经典的方法来改进 Python 中的几乎任何函数。

Cache

也许 functools 模块提供的最酷的功能是能够在内存中缓存某些计算,而不是丢弃它们以后再重新计算。这是节省处理时间的好方法,尤其是当遇到无法解释的 Python3 超时情况时。尽管这需要使用更多的内存来进行权衡,但是在许多不同的情况下使用内存无疑是有意义的。在 Python 中内存管理本身是相当明确的,通常解释器会为我们处理所有内存管理。尽管这是一种效率较低的编程方法,但它也消除了许多分配内存和此类性质的麻烦。使用 functools,我们可以通过确定栈中的内容以及自己将要重新计算的内容的方式来对此进行一些更改。

functools提供的缓存的优点在于,它不仅易于使用,而且可以更好地控制其代码下的解释器。充分利用此强大功能就像在函数上方调用它一样简单。这里有一个关于阶乘计算的例子:

def factorial(n):
    return n * factorial(n-1) if n else 1

为了在这个函数中使用缓存,我们将从 functools 中导入 lru 缓存,并在函数之前调用它:

@lru_cache
def factorial(n):
    return n * factorial(n-1) if n else 1

现在,让我们评估仅通过执行此简单添加即可获得的性能收益。让我们看看没有阶乘函数,阶乘函数计算阶乘的速度有多快:

FuncTools:一个被低估的Python包_第1张图片

现在重新启动内核,以确保不会出现奇怪的内存问题,并运行使用 lru _ cache 的新函数。

FuncTools:一个被低估的Python包_第2张图片

从这个例子中,我们已经可以看到使用这种缓存技术的巨大好处。众所周知,阶乘很难通过计算机来计算。在大多数情况下,这是因为阶乘是递归的自然数学示例。计算量如此之大,以至于编程语言的基本阶乘函数通常会使用查找表,而不是计算数字。

这个标准的库工具可以大大加快问题的处理速度,这些问题通常是Python很难解决的。

Key Functions

是否曾经有过这样的情况: 你想使用一些非常古老的 Python 代码中的函数,但是这个函数被编译成一个比较函数?这些类型的函数在 Python 3中已经不再受到良好的支持,甚至不再使用,而且将一种函数类型转换为另一种函数类型可能相当困难。然而,functools 可以通过另一个简单的方法调用轻松修复这个问题:

newfn = cmp_to_key(myfunction)

Partial

Partial 函数将返回一个新的 partial 对象,然后可以使用相同的参数调用该对象,并且它的功能与前面的函数完全相同。代码如下:

def partial(func, /, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = {**keywords, **fkeywords}
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

我们可以通过上面的 factorial 函数创建一个partial函数:

from functools import partial
fact = partial(factorial)
fact(10)

Reduce

Reduce 函数将使用两个参数的函数进行累积迭代。考虑到这一点,我们将需要我们的参数是迭代的。在本例中,我们将使用一个生成器,range。这将使我们能够非常容易地构造一个任意长度的列表数据类型。

from functools import reduce
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

这会有什么作用?这会将迭代器简化为简化列表形式,节省运行时性能。

总结

这真是一个非常棒的模块,对于 python 程序员来说掌握它是非常有用的,可以使我们以最小的工作量简化代码和数学运算,让我们事半功倍。

·  END  ·

HAPPY LIFE

FuncTools:一个被低估的Python包_第3张图片

你可能感兴趣的:(python,java,编程语言,人工智能,js)