django - 在 python 中省略 imprts 以提高性能是否合理?
问题描述
所以我一直想知道天气忽略 DRY 规则而不是导入对 python 和 django 的性能有好处。我知道当在 python 中导入某些东西时,它需要运行它来搜索错误,所以我在这里所做的似乎是合理的,但我也知道 User 是在我的项目的其他地方导入的,所以我实际上通过下面显示的方法获得了什么?
# from django.contrib.auth.models import User
class RegistrationForm(forms.ModelForm):
"""
Registration form for User. Import omitted for performance.
"""
password_1 = forms.CharField(required=True, widget=forms.PasswordInput)
password_2 = forms.CharField(required=True, widget=forms.PasswordInput)
username = forms.CharField()
email = forms.CharField(widget=forms.EmailInput)
# class Meta:
# model = User
# fields = ('username', 'email')
解决方案
所以我一直想知道天气忽略 DRY 规则而不是导入对 python 和 django 的性能有好处。
通常不会。事实上,DRY 会经常提高性能。即使它导致代码效率稍低,这也只是加载程序时通常会产生的成本,因此是恒定成本,而不是线性成本。
如果你导入一个模块。Python 将首先检查它是否已经具有重要的模块。在这种情况下,它不会再次加载文件。它只是将对该模块中对象的一些引用作为局部变量传递。
通过导入而不是定义第二个类(几乎相同),内存占用更小。由于您在内存中只有一个可以重用的类。它还可以稍微提高性能,因为“缓存错误”的机会更小。此外,这将导致更多的解释性工作,特别是因为类似的模块django.contrib.auth.forms
被大量使用,因此它不太可能不在其他位置加载。
但 DRY 当然主要是一种软件设计原则。性能改进通常不是那么高(有时确实会导致效率低下)。但是通常一次做一件好事要好得多,而不是尝试多次实现它。在您的RegistrationForm
中,您实际上在这里有一个错误,因为您没有检查密码是否匹配,也没有使用 设置密码.set_password(..)
。
想象一下,稍后您在一个注册表单中发现了一个安全漏洞,那么您将需要更改您引入该漏洞的所有功能。这是一个棘手的问题,因为您肯定有可能忘记了某些表单,或者您以错误的方式修复了某些表单,从而引入了更多的安全漏洞。此外,它会导致复杂的代码库。后来当代码库增长时,理解你的程序变得更加困难,未来的同事将很难理解代码库。
Python 并不是最有效的语言。这部分是因为它非常动态的性质。这个想法是“硬件便宜,程序员很贵” [codinghorror]。因此,即使您的程序效率稍低,通常也不会花费太多,因为您可以购买更快的机器。从 CPU 中取出最后一个周期的成本更高,因为这需要大量的编程工作,这通常比更快的机器成本更高。
推荐阅读
- audio - 如何解决以八度音阶执行 FM 解调的错误?
- angular - 如何在 Angular 8 中销毁 ngx-swiper-wrapper
- java - 除了迭代器对象之外,还有哪些不同的方法可以遍历向量?
- jruby - 从多个线程写入文件
- javascript - 在 javascript/es6 的 forEach 循环中使用 find()
- javascript - JS中输入的未定义值
- mysql - 如果值多次存在并且满足每个条件的一个条件,则列出所有值
- oracle - 无法通过 JMS 客户端将大型文本消息排入 Oracle AQ - ORA-00942:表或视图不存在
- azure - Synapse LINK 从 Azure Cosmos DB 容器加载流数据帧
- asp.net-mvc-4 - 部分视图在 POSTBACK 上返回 NULL