0

我找到了这段代码并开始想,为什么不简单地将导入替换为自己的实现呢?使用 functools.partial 有什么(性能)好处吗?它是用纯 Python 还是本机代码实现的?

try:
    from functools import partial
except ImportError:
    # http://docs.python.org/library/functools.html#functools.partial
    def partial(func, *args, **keywords):
        def newfunc(*fargs, **fkeywords):
            newkeywords = keywords.copy()
            newkeywords.update(fkeywords)
            return func(*(args + fargs), **newkeywords)

        newfunc.func = func
        newfunc.args = args
        newfunc.keywords = keywords
        return newfunc
4

1 回答 1

1

大多数 functools,包括部分,都是用 C 编写的,这里是 functools.py 的头文件

"""functools.py - Tools for working with functions and callable objects
"""
# Python module wrapper for _functools C module
# to allow utilities written in Python to be added
# to the functools module

在这个特定的引用中,可以说导入是不必要的,好像你无论如何都必须定义回退函数,为什么要在导入上浪费两行,我认为它仍然是有益的:

1)库中的函数可能更快,即使不是,它也可能在未来的版本中变得更快(内置插件确实会不时进行优化),或者它可能在不同的平台上更快,或者甚至是不同的实现(例如 pypy vs cpython)。反过来也可能是正确的,这就是为什么我认为下面的第 2 点更为重要,除非您有特定的性能问题。

2)任何审查您的代码的开发人员都可以通过参考标准文档来理解您的部分函数的作用。即使 functools 无法导入,任何读者都将能够从尝试的导入中看到纯 python 实现将要做什么,以及它应该如何表现。

于 2015-12-12T18:14:51.357 回答