为什么在Django服务器上执行这个循环需要5秒,而在shell中只需要0.8秒?

2024-04-25 19:15:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找出python django项目中的时间差异。你知道吗

当我在shell中运行函数时,只需要大约一秒钟就可以得到返回对象并返回它。你知道吗

当我使用api调用运行它时,计时显示循环和序列化对象需要5秒以上的时间。你知道吗

以下是相关功能:

def serialize_particular(id=-1, all_available=False, page=0, maxOn=40):
    if id != -1:
        b = MyModel.objects.filter(id=id)

        if len(b) == 0:
            return []
        else:
            b = b[0]
        data = []

        if all_available:
            oThings = b.things
        else:
            oThings = b.things_available

        count = len(oThings)
        start = maxOn * page
        end = start + maxOn
        if start > count:
            oThings = oThings.filter(id=-1)
            nextPage = -1
        else:
            if end > count:
                end = count
                page = -2
            oThings = oThings[start:end]
            nextPage = page + 1

        for inv in oThings:
            data.append({})
            data[-1]['id'] = inv.id
            data[-1]['available'] = inv.available
            data[-1]['integer'] = inv.integer
            data[-1]['subObject'] = {}
            data[-1]['subObject']['name'] = inv.subObject.name
            data[-1]['subObject']['category'] = inv.subObject.category
            data[-1]['subObject']['subcategory'] = inv.subObject.subcategory
            data[-1]['subObject']['listOfSubs'] = []
            for subsub in inv.subObject.listOfSubs.all():
                data[-1]['subObject']['listOfSubs'].append({})
                data[-1]['subObject']['listOfSubs'][-1]['name'] = subsub.name
                data[-1]['subObject']['listOfSubs'][-1]['category'] = subsub.category
                data[-1]['subObject']['listOfSubs'][-1]['subcategory'] = subsub.subcategory

        return data, nextPage

下面是我在服务器中使用的计时功能:

class Timing:

    active = True

    def __init__(self, text):
        if self.active:
            self.text = text
            self.start = time.time()

    def end(self):
        if self.active:
            self.end = time.time()
            self.total = self.end - self.start
            print("[%r] %2.6f s" %(self.text, self.total))

下面是我在服务器api调用中使用的相关代码:

    T = Timing("API.things: Getting MyModel things")
    s = serialize_particular(1, False, 0, 50000)
    data = s[0]
    nextPage = s[1]
    T.end()

以下是服务器日志中的计时输出:

['API.things: Getting MyModel things'] 5.652001 s

下面是我的shell的输出:

>>> def t(id):
...     T = Timing("API.things: Getting MyModel things")
...     z = api.serialize_business_inventory(id, False, 0, 50000)
...     T.end()
...     return z

>>> s = t(1)
['API.things: Getting MyModel things'] 0.469001 s

有人知道为什么会这样吗?你知道吗


Tags: selfiddataifdefpagestartmymodel