首页 > 解决方案 > 在 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')

标签: djangopython-3.x

解决方案


所以我一直想知道天气忽略 DRY 规则而不是导入对 python 和 django 的性能有好处。

通常不会。事实上,DRY 会经常提高性能。即使它导致代码效率稍低,这也只是加载程序时通常会产生的成本,因此是恒定成本,而不是线性成本。

如果你导入一个模块。Python 将首先检查它是否已经具有重要的模块。在这种情况下,它不会再次加载文件。它只是将对该模块中对象的一些引用作为局部变量传递。

通过导入而不是定义第二个类(几乎相同),内存占用更小。由于您在内存中只有一个可以重用的类。它还可以稍微提高性能,因为缓存错误的机会更小。此外,这将导致更多的解释性工作,特别是因为类似的模块django.contrib.auth.forms被大量使用,因此它不太可能不在其他位置加载。

但 DRY 当然主要是一种软件设计原则。性能改进通常不是那么高(有时确实会导致效率低下)。但是通常一次做一件好事要好得多,而不是尝试多次实现它。在您的RegistrationForm中,您实际上在这里有一个错误,因为您没有检查密码是否匹配,也没有使用 设置密码.set_password(..)

想象一下,稍后您在一个注册表单中发现了一个安全漏洞,那么您将需要更改您引入该漏洞的所有功能。这是一个棘手的问题,因为您肯定有可能忘记了某些表单,或者您以错误的方式修复了某些表单,从而引入了更多的安全漏洞。此外,它会导致复杂的代码库。后来当代码库增长时,理解你的程序变得更加困难,未来的同事将很难理解代码库。

Python 并不是最有效的语言。这部分是因为它非常动态的性质。这个想法是硬件便宜,程序员很贵” [codinghorror]。因此,即使您的程序效率稍低,通常也不会花费太多,因为您可以购买更快的机器。从 CPU 中取出最后一个周期的成本更高,因为这需要大量的编程工作,这通常比更快的机器成本更高。


推荐阅读