Django:从一个模块导入一个视图比在views.py文件中包含它要慢吗?

时间:2011-10-04 18:13:07

标签: python django

这可能更像是一个关于Python本身如何导入方法的问题,虽然我在表面层面上理解,但我并没有真正深入了解。

极其简化的例子可能会让事情变得更加清晰。在下面两个例子中,执行速度会有明显的差异吗?

示例1

# views.py

from app_name.models import *

def add_item(request, name, category):
    item = Item(name=name, category=category)
    item.save()
    return HttpResponseRedirect('/')

示例2

# views.py

from app_name.models import *
from app_name.items import add_new_item

def add_item(request, name, category):
    item = add_new_item(request, name, category)
    return HttpResponseRedirect('/')

# items.py

def add_new_item(request, name, category):
    item = Item(name=name, category=category)
    item.save()
    return item

我应该再次补充说,这是一个极其简化的例子,并不反映实际的现实世界决定。我只是想了解Python的工作原理,以及示例2是否会明显变慢,如果是这样,在什么情况下。

感谢。

3 个答案:

答案 0 :(得分:5)

你不会看到速度上的任何差异。导入模块后,它将保留在内存中,因此无需再次加载。您可以像这样检查已加载的内容:

import sys
print sys.modules
# {'cStringIO': <module 'cStringIO' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/cStringIO.so'>, 'copy_reg': <mo........

答案 1 :(得分:3)

导入内容的行为会“降低”应用程序的速度。但是,我们讨论的是从文件系统读取文件并将其编译一次 - 毫秒所需的时间。所以,是的,导入视图与视图只是存在较慢,但实际上,没有区别。

答案 2 :(得分:2)

正如其他人已经指出的那样,您的示例不会有任何区别,因为导入只会发生一次。 更重要的是,你应该确保不做例如。函数内部的任何导入,如果它是可以避免的,因为每次执行函数时都会重做这些导入!

如果你想拥有清晰且可维护的代码,那么处理你的导入结构就更为重要了,像from app_name.models import *这样的通配符导入是非常邪恶的,你应该避免它! 另见例如。这post