通过自己的纯Python impl导入functools的好处?

时间:2015-12-12 16:59:26

标签: python performance python-import functools

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

import decimal
import webapp2
from google.appengine.ext import ndb
import json
from google.appengine.api import users


class Item(ndb.Model):
    author = ndb.UserProperty(required=False)
    summary = ndb.StringProperty(required=True)
    description = ndb.StringProperty()
    url = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
    updated = ndb.DateTimeProperty(auto_now=True)
    updated = ndb.StringProperty()
    dueDate = ndb.StringProperty(required=True)
    finished = ndb.BooleanProperty()


class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'isoformat'):
            return obj.isoformat()
        elif isinstance(obj, decimal.Decimal):
            return float(obj)
        else:
            return json.JSONEncoder.default(self, obj)


class GetAllItems(webapp2.RequestHandler):
    def get(self):
        item = Item(summary="Summary", dueDate="Date")
        item.put()

        text = json.dumps([i.to_dict() for i in Item.query().fetch()], cls=DateTimeEncoder)
        self.response.out.write(text)


app = webapp2.WSGIApplication(
    [
        ('/api/items', GetAllItems)
    ],
    debug=True)

1 个答案:

答案 0 :(得分:1)

大多数functools,包括partial,都是用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实现将要做什么,以及它应该如何表现。