【问题标题】:Is omitting imprts in python for performance reasonable?为了性能而在 python 中省略导入是否合理?
【发布时间】:2019-09-01 11:09:07
【问题描述】:

所以我一直想知道忽略 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')

【问题讨论】:

  • “它需要运行它来搜索错误”是什么意思?
  • 如果您想知道省略技术冗余导入是否会影响性能,您可以使用和不使用它们进行基准测试(为此启动版本控制分支将为您提供一种简单的方法来区分和交换更改并进行测试)。我严重怀疑您是否会看到任何有意义的性能提升,但您失去可读性并可能使您或其他人的 IDE 不满意,因此我个人什至不会费心花时间设置基准为此。
  • 与定义新类相比,它经常提升性能,因为它减少了内存占用(Python 绝对不是内存效率最高的语言)。
  • @WillemVanOnsem 据了解,每当您在 python 中导入某些内容时,它会加载整个脚本并运行,然后允许主程序使用导入的功能
  • @pawqo:是的。但它会这样做一次,你可以说它周围有一个“记忆”模式。很可能它已经以某种方式被导入了。例如由于INSTALLED_APPS 中的'django.contrib.auth'。此外,加载文件有一些初始成本,但仅此而已。定义第二个类对内存的影响更大,并且会一直存在,因此开销与服务器运行的时间成线​​性关系。

标签: django python-3.x


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2018-06-08
    • 2015-11-16
    • 2023-03-05
    相关资源
    最近更新 更多