2010-09-23 72 views
1

可有人請證明爲什麼它是一個不好的做法,使用的解決方案是這樣的:Django的/ Python的進口PERFOMANCE

在Django意見,98%的情況下,您需要在我的項目中使用

from django.http import HttpResponseRedirect 
    from django.core.urlresolvers import reverse 
    from django.utils.translation import ugettext as _ 

反正我每個視圖具有這些進口,一切都在視圖中的每一秒功能用得差不多:

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 _ 

現在添加一些模型和形式,我有50行胡說這是不可能與r一點都沒有。

我腦海中的第一件事當然是製作更多的視圖,分割一些操作等等,但仍然有大約30行進口導致我在代碼中的方向失效。

然後我決定把所有在視圖中使用的所有東西都按95%的時間放到/project/app/imports/view.py目錄中。現在,我擁有所有常見的東西,只需要導入ONE,但是我的同事攻擊了我,閱讀這種代碼非常困難,因爲您看不到導入的內容,以及爲什麼它很難在您的IDE中打開另一個選項卡..? [特別是vim用戶,他們有框架,他正在使用vim]

我對模型做了同樣的事情,我的模型有它自己的目錄,因爲它超過了50個,並且這些文件不是很小 - 約150行,每行。即使這些文件裏面有幾個型號..所以我只是在做這樣的事情:

from myapp.models.mymodel import * 

,並有一些地方,我只是在做:from myapp.models import * [初始化的.py的myapp/imports dir發生在這裏]

問題:

1)確定,所以第一個問題是命名空間,這種模型進口的是,也許真是可笑。但隨着意見和形式決定,只是不過lazziness在IDE中打開一個更片

2 )性能問題?我的同事真的在爭論很多,「每次進口需要256kb的內存」? (通過運行編譯.pyc文件?不,我不相信;)

這個問題實際上是關於性能問題,因爲進口。

p.s.我真的是python新手(僅僅3個月),並且我開放給所有關於這個解決方案的probs和cons的OBJECTIVE參數。

UPDATE

有一次我問有關如何移動進口到獨立的文件,所以沒有人抱怨過這個問題=)問題是here

回答

2

請記住,你可以導入一組子包的。所以

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 _ 

可以成爲

from django import conf, contrib, db, http, shortcuts, template, utils 
from django.core import urlresolvers, paginator 

這是短暫的,可以讓你避免編寫django無處不在,並讓它很明顯,其中像urlresolvers.reverse是從哪裏來的。這還有一個好處,就是不會將reverse等通用名稱映射到高度特定的功能,讓您獲得更多可讀代碼。

5

1)它只不過是懶惰不使用前綴與導入的名字它來自的模塊。懶惰不願意滾動輸入代碼。在另一個文件中導入亂七八糟的文件如何更容易閱讀?我會把它放在實際使用的原始文件中。這改善可讀性,因爲如果我需要知道某些東西來自哪裏,那麼我可以只是去文件的頂部,並檢查出來(使用emacs標記環向右走)。這也使維護列表變得更容易,因爲我只需要快速搜索以查看哪些內容被使用(或未使用)。

2)在我的機器上,導入模塊需要〜812微秒。

$ python -mtimeit -s'import os' 'reload(os)' 
1000 loops, best of 3: 808 usec per loop 

這當然與在您的PYTHONPATH是差別很大。如果表現如此緊張,你可以通過扭轉局面來擠出一些。因人而異。

我不知道你的同事從哪裏得到256kb的。這將取決於所涉及的代碼對象的大小。

>>> import sys 
>>> sys.getsizeof(sys) 
24 
>>> sys.getsizeof(sys.modules['__main__']) 
24 

正如你所看到的,實際的模塊對象只需要我的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 
+0

這不是懶惰的寫作,而是閱讀,這隻會讓代碼中的整體混亂。所以這不是爭論。談論性能,他還說因爲這個項目每天會有大量的訪問者[這將會變得非常巨大],這可能是一個問題 – holms 2010-09-23 22:52:58

+0

btw我說的是把所有進口設置爲獨立文件=) – holms 2010-09-23 23:01:05

+0

@holms,I確切地知道你在說什麼。我只是叫你出於你從同事的角度來看懶惰。 – aaronasterling 2010-09-23 23:02:59

1

幾點考慮:

需要導入一個模塊的時間,幾乎在所有的情況下,完全不相干的:它只會發生一次。您的Django視圖模塊不會被導入併爲每個請求重新評估;它被加載一次然後被重用。如果你的模塊不斷重新加載,那麼某些東西是災難性的錯誤。

每進口是不是需要256kb的內存。也許每個單獨的文件,加載一次,(雖然我也懷疑),但重複導入相同的文件不會每次都花費256kb;它只是創建一個參考。如果內存使用有問題,只需簡單分析它 - 加載10000個內容並查看使用了多少內存。

對於Django模塊,您並不總是需要爲每個模塊創建一個目錄;我從models/__init__.py(例如,from Customer import Customer)導入每個模型類,所以我可以說from myapp.models import Profile, Customer, Book, ...


Django視圖傾向於在頂部需要十幾行導入確實是一個問題。它會變成樣板文件,這是您每次啓動新文件時複製和粘貼的代碼。需要樣板的源代碼是一個主要缺陷。

與此同時,我強烈建議不要有人推薦:import django,然後使用完全限定的模塊名稱。結果是輸入django.core.urlresolvers.reverse之類的東西。當你發現自己經常複製和粘貼函數名稱,因爲它們太長了,出了問題。

沒有單一的,明確的,明顯正確的解決方案。把一直用在另一個模塊中的東西放在一個有效的解決方案中,但是它存在合理的問題:很難看到正在導入的內容以及導入結果的使用位置。

如果您導入「模塊集合」模塊本身 - import djangohelpersimport djangohelpers as dh,您可能會發現較少的腸道反應異議。然後,你寫的東西,如dh.paginator。它爲名稱提供了一個明確的範圍,並且使它更容易查看它的使用位置以及特定函數名稱的來源,這些名稱因「import *」而丟失。

(你也許想要導入之類的東西Q_裸露的名字,雖然)。