2015-12-12 41 views
0

我發現這段代碼並開始想知道,爲什麼不簡單地用自己的實現來替換導入? 使用functools.partial有什麼(性能)好處嗎?它是用純Python還是本機代碼實現的?通過自己的純Python impl導入functools的好處?

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 
+1

'partial'在'_functools'中定義,它是一個本地編譯的庫。我認爲原因是它可以做一些比簡單地將一個可調用對象包裝在另一個可調對象中更高效的事情。 – chepner

+1

在'functools.py'開頭,你應該看到'from _functools import partial'。這就是爲什麼'partial'不是在純Python中實現的。 – chepner

回答

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實現將要做什麼,以及它應該如何表現。