Python Django urlconf性能:嵌套模式组会有帮助还是有害?

Python Django urlconf性能:嵌套模式组会有帮助还是有害?,python,django,performance,readability,urlconf,Python,Django,Performance,Readability,Urlconf,我想知道当Django寻找请求匹配模式时,用几个嵌套的模式组重新构造我的应用程序的URLConf是否能提高性能。我不确定如何测试性能,但我已经尝试过了,新版本至少可以工作 我知道,如果有一个性能提升,它也可以忽略不计。我开始这么做只是为了看看这些模式是否更容易作为一棵树来看待;我更担心把事情搞砸,而不是加快速度 以下是主urlconf在/appname/中包含的应用程序的urlconf 旧urlconf: from django.contrib.auth.decorators import lo

我想知道当Django寻找请求匹配模式时,用几个嵌套的模式组重新构造我的应用程序的URLConf是否能提高性能。我不确定如何测试性能,但我已经尝试过了,新版本至少可以工作

我知道,如果有一个性能提升,它也可以忽略不计。我开始这么做只是为了看看这些模式是否更容易作为一棵树来看待;我更担心把事情搞砸,而不是加快速度

以下是主urlconf在
/appname/
中包含的应用程序的urlconf

旧urlconf:

from django.contrib.auth.decorators import login_required
from django.conf.urls.defaults import patterns, include, url
from django.views.generic.simple import redirect_to

from appname import views

urlpatterns = patterns('',
    # Actions on sets of reports
    url(r'^reports/page(?P<page>[0-9]+)/$', login_required(views.appnameListView.as_view())),
    url(r'^reports/bill/', views.bill),

    # Actions on individual reports
    url(r'^report/new/', views.new),
    url(r'^report/(?P<reportNumber>[^/]+)/$', views.detail),
    url(r'^report/(?P<reportNumber>[^/]+)/delete/$', views.delete),
    url(r'^report/(?P<reportNumber>[^/]+)/edit/$', views.edit),
    url(r'^report/(?P<reportNumber>[^/]+)/print/$', views.detail_print),
    # url(r'^report/(?P<reportNumber>[^/]+)/pdf/$', views.detail_pdf),

    # Configure app settings
    url(r'^config/$', views.configure),
    url(r'^config/reporttype/(?P<id>[^/]+)/$', views.configure_ReportType),
    url(r'^config/reporttype/(?P<id>[^/]+)/delete/$', views.configure_ReportType_delete),
    url(r'^config/avgmethod/(?P<name>[^/]+)/$', views.configure_AvgMethod),
    url(r'^config/avgmethod/(?P<name>[^/]+)/delete/$', views.configure_AvgMethod_delete),
    url(r'^config/datatransformer/(?P<name>[^/]+)/$', views.configure_DataTransformer),
    url(r'^config/datatransformer/(?P<name>[^/]+)/delete/$', views.configure_DataTransformer_delete),

    # Catch all; #TODO: 404
    url(r'^', redirect_to, {'url': '/appname/reports/page1/'}),
)
从django.contrib.auth.decorators导入登录名\u必需
从django.conf.url.defaults导入模式,包括url
从django.views.generic.simple导入重定向到
从appname导入视图
urlpatterns=模式(“”,
#对多套报告采取的行动
url(r'^reports/page(?P[0-9]+)/$),需要登录(views.appnameListView.as_view()),
url(r“^reports/bill/”,views.bill),
#就个别报告采取的行动
url(r“^report/new/”,views.new),
url(r'^report/(?P[^/]+)/$,views.detail),
url(r'^report/(?P[^/]+)/delete/$,views.delete),
url(r'^report/(?P[^/]+)/edit/$,views.edit),
url(r'^report/(?P[^/]+)/print/$,views.detail_print),
#url(r'^report/(?P[^/]+)/pdf/$,views.detail_pdf),
#配置应用程序设置
url(r'^config/$,views.configure),
url(r'^config/reporttype/(?P[^/]+)/$,views.configure_reporttype),
url(r'^config/reporttype/(?P[^/]+)/delete/$,视图。配置报告类型\u delete),
url(r'^config/avgmethod/(?P[^/]+)/$),views.configure_avgmethod),
url(r'^config/avgmethod/(?P[^/]+)/delete/$,视图。配置\u avgmethod\u delete),
url(r'^config/datatransformer/(?P[^/]+)/$,视图。配置\u datatransformer),
url(r'^config/datatransformer/(?P[^/]+)/delete/$,视图。配置\u datatransformer\u delete),
#包罗万象;#待办事项:404
url(r'^',重定向到,{'url':'/appname/reports/page1/'}),
)
新urlconf:

from django.contrib.auth.decorators import login_required
from django.conf.urls.defaults import patterns, include, url
from django.views.generic.simple import redirect_to

from appname import views

urlpatterns = patterns('',
    # Actions on sets of reports
    url(r'^reports/', include(patterns('',
        url(r'^page(?P<page>[0-9]+)/$', login_required(views.appnameListView.as_view())),
        url(r'^bill/', views.bill),
    ))),

    # Actions on individual reports
    url(r'^report/', include(patterns('',
        url(r'^new/', views.new),
        url(r'^(?P<reportNumber>[^/]+)/$', views.detail),
        url(r'^(?P<reportNumber>[^/]+)/delete/$', views.delete),
        url(r'^(?P<reportNumber>[^/]+)/edit/$', views.edit),
        url(r'^(?P<reportNumber>[^/]+)/print/$', views.detail_print),
        # url(r'^(?P<reportNumber>[^/]+)/pdf/$', views.detail_pdf),
    ))),

    # Configure app settings
    url(r'^config/', include(patterns('',
        url(r'^$', views.configure),
        url(r'^reporttype/(?P<id>[^/]+)/$', views.configure_ReportType),
        url(r'^reporttype/(?P<id>[^/]+)/delete/$', views.configure_ReportType_delete),
        url(r'^avgmethod/(?P<name>[^/]+)/$', views.configure_AvgMethod),
        url(r'^avgmethod/(?P<name>[^/]+)/delete/$', views.configure_AvgMethod_delete),
        url(r'^datatransformer/(?P<name>[^/]+)/$', views.configure_DataTransformer),
        url(r'^datatransformer/(?P<name>[^/]+)/delete/$', views.configure_DataTransformer_delete),
    ))),

    # Catch all; #TODO: 404
    url(r'^', redirect_to, {'url': '/appname/reports/page1/'}),
)
从django.contrib.auth.decorators导入登录名\u必需
从django.conf.url.defaults导入模式,包括url
从django.views.generic.simple导入重定向到
从appname导入视图
urlpatterns=模式(“”,
#对多套报告采取的行动
url(r“^reports/”,包括(模式(“”,
url(r'^page(?P[0-9]+)/$,需要登录(views.appnameListView.as_view()),
url(r“^bill/”,views.bill),
))),
#就个别报告采取的行动
url(r“^report/”,包括(模式(“”,
url(r“^new/”,views.new),
url(r'^(?P[^/]+)/$,views.detail),
url(r'^(?P[^/]+)/delete/$,views.delete),
url(r'^(?P[^/]+)/edit/$,views.edit),
url(r'^(?P[^/]+)/print/$,视图。详细信息_-print),
#url(r'^(?P[^/]+)/pdf/$,views.detail_pdf),
))),
#配置应用程序设置
url(r“^config/”,包括(模式(“”,
url(r'^$',views.configure),
url(r'^reporttype/(?P[^/]+)/$,视图。配置报告类型),
url(r'^reporttype/(?P[^/]+)/delete/$,视图。配置报告类型\u delete),
url(r'^avgmethod/(?P[^/]+)/$),视图。配置\u avgmethod),
url(r'^avgmethod/(?P[^/]+)/delete/$,视图。配置\u avgmethod\u delete),
url(r'^datatransformer/(?P[^/]+)/$,视图。配置\u datatransformer),
url(r'^datatransformer/(?P[^/]+)/delete/$,视图。配置\u datatransformer\u delete),
))),
#包罗万象;#待办事项:404
url(r'^',重定向到,{'url':'/appname/reports/page1/'}),
)

我可以更进一步(使用regex检查的5个变量中有4个至少定义了两次),但我担心会失去可读性的最初好处。

如果您不想重复并遵循DRY原则,这在开发django代码时有时会被大量合并,那么您应该对URL进行分组。因此,您将减少重复代码的数量,并生成更易于维护的代码。例如,考虑到这样一个事实,即以后您可能想要将报告/url更改为其他内容,那么您必须为每个url执行此操作

正如你所说的,如果速度有所提高,那是微不足道的。这里似乎没有问题。每个人都知道,如果需要提高性能,最好花时间查看数据库查询。:)你为什么不做一些分析,然后再联系我们呢?非常正确,请记住:!;)@JanPöschko:我也在考虑添加这一点,但也可能有很多用于管理员的URL,这些URL可能会因网站功能的改变而改变:)而且,因为您提到了URI:如果您对URL进行分组,您将更容易更好地了解哪些模式属于哪个资源。。。