有人可以证明为什么使用这样的解决方案是一个坏习惯:
在django中,98%的案例需要使用
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _
Run Code Online (Sandbox Code Playgroud)
无论如何在我的项目中我的每个视图都有这些导入,并且几乎在视图的每个第二个函数中都使用了所有内容:
from datetime import datetime
from django.conf import settings
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.core import paginator
from django.db import connection
from django.db.models import Q
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.utils.translation import ugettext as _
Run Code Online (Sandbox Code Playgroud)
现在添加一些模型和表单,我有50行废话,根本无法读取.
我头脑中的第一件事当然是提出更多观点,分割一些操作等等.但仍然有大约30行导入在代码中杀死了我的方向.
然后我决定将95%的时间内在视图中使用的所有内容放到目录/project/app/imports/view.py中.现在我有一些常见的东西,只有一个导入,但我的同事攻击我,这是非常难以阅读这种代码,因为你无法看到什么是导入,以及为什么这么难打开一个IDE中的更多选项卡.. ??? [特别是vim用户,他们有FRAMES,他正在使用vim]
我对模型做了同样的事情,我的模型有它自己的目录,因为它在那里超过50个,而且那些文件不小 - 每个约150行..即使这些文件内部的模型很少..所以我只是在做就像是 :
from myapp.models.mymodel import *
Run Code Online (Sandbox Code Playgroud)
还有一些地方,我只是在做:from myapp.models import *[ 初始化的.py MYAPP的/进口DIR发生在这里]
问题:
1)确定所以第一个问题是命名空间,这种模型导入可能真的很荒谬..但是使用视图和表单的决定只是在IDE中打开一个更多选项卡的懒惰
2)性能问题?我的同事真的在争论这个论点,"每次进口需要256kb的ram"?(通过运行编译的.pyc文件?不,我不相信;)
事实上,问题是由于进口导致的性能问题.
ps我是python中的新手(仅仅3个月),我对所有关于这个解决方案的问题和缺点的OBJECTIVE论证开放.
UPDATE
一旦我问到如何将导入移动到独立文件的问题,所以没有人抱怨这个=)问题在这里
1)只是懒惰而不是将导入的名称作为它来自的模块的前缀.只是懒惰而不愿意滚动导入代码.如何在另一个文件中使用那些混乱的导入使它更容易阅读?我会将它保留在实际使用它们的原始文件中.这提高了可读性,因为如果我需要知道某些东西来自何处,那么我可以直接找到文件的顶部并将其检出(使用emacs标记环直接返回).它还使维护列表更容易,因为我只需要快速搜索以查看某些内容的使用(或未使用).
2)在我的机器上,导入模块需要大约812微秒.
$ python -mtimeit -s'import os' 'reload(os)'
1000 loops, best of 3: 808 usec per loop
Run Code Online (Sandbox Code Playgroud)
当然,这与您的PYTHONPATH的位置有很大差异.如果表现如此紧张,你可能可以通过玩杂耍来挤出一些.因人而异.
我不确定你的同事从哪里获得256kb.这取决于所涉及的代码对象的大小.
>>> import sys
>>> sys.getsizeof(sys)
24
>>> sys.getsizeof(sys.modules['__main__'])
24
Run Code Online (Sandbox Code Playgroud)
如您所见,实际的模块对象在我的32位机器上只需要24个字节.我有一种感觉,虽然会依赖于系统.
>>> def sizeofmodule(mod):
... return sum(sys.getsizeof(getattr(mod, o)) for o in dir(mod))
...
>>> sizeofmodule(itertools)
8662
>>> sizeofmodule(sys)
10275
>>> sizeofmodule(operator)
5230
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |