最高效的进口方式

时间:2016-11-05 16:58:06

标签: python

从性能的角度来看(时间或内存)是否更好:

import pandas as pd

from pandas import DataFrame, TimeSeries

最好还是要依赖我从包中导入多少个类?

同样,我看到过人们会这样做:

def foo(bar):
    from numpy import array

为什么我要在函数或方法定义中进行导入?这不意味着每次调用函数时都会执行导入吗?或者这只是为了避免命名空间冲突?

3 个答案:

答案 0 :(得分:6)

这是微观优化,你不应该担心这个。

每个Python进程一次加载模块。然后,只导入的所有代码都需要将名称绑定到模块中定义的模块。该绑定非常便宜

此外,您的模块中的顶级代码也只运行一次,因此绑定只发生一次。函数中的导入会在每次运行函数时执行绑定,但同样,这样可以忽略不计。

导入函数有两个原因:它不会将该名称放在模块的全局命名空间中(因此没有命名空间污染),并且因为名称现在是 local ,使用该名称比使用全局名称要快一些。

如果您想提高性能,请关注重复多次的代码。导入不是它。

答案 1 :(得分:1)

回答关于何时进口的更一般的问题,进口是依赖性的。程序运行所需的代码可能存在也可能不存在。因此,最好尽快导入该代码,以防止在执行过程中出现哑误差。

当pypy变得更受欢迎时,尤其如此,当导入可能存在但不能通过pypy使用时。最好早点失败,比执行代码可能需要几个小时。

至于#34;将pandas导入pd" vs"来自pandas导入DataFrame,TimeSeries",这个问题有多个问题(所有问题都有),其中一些比其他问题重要得多。存在命名空间的问题,还有可读性问题,还有性能问题。 Martjin表示,业绩应该占决策的0.0001%左右。可读性应该贡献大约90%。命名空间只有10%,因为它可以很容易地减轻。

就个人而言,在我看来,import X as Yform X import Y都是不好的做法,因为明确比隐含更好。你不想在2000年试图记住哪个包" calculate_mean"来自于因为它没有在代码中的任何其他位置引用。当我第一次开始使用numpy时,我是从互联网上复制/粘贴代码,并且无法弄清楚为什么我没有/不能pip install np。如果您已经预先知道" np"这显然不是问题。是" numpy"的python,但对于它保存的3个字母来说,这是一个愚蠢而毫无意义的混淆。它来自numpy。使用numpy。

答案 2 :(得分:1)

在函数内部导入尚未提及的模块有一个优点:这样做可以控制模块何时加载。实际上,尽管@ J.J的答案建议尽早导入所有模块,但此控件允许您推迟加载模块。

你为什么要那样做?好吧,虽然它没有改善程序的实际性能,但这样做可以提高感知性能,并且凭借这一点,用户体验

  

在某种程度上,用户会根据启动所需的时间来判断您的应用是快还是慢。

MSDN: Best practices for your app's startup performance

在主脚本开头加载每个模块可能需要一些时间。例如,我的一个应用程序使用Qt框架,Pandas,Numpy和Matplotlib。如果所有这些模块都是在应用程序开头导入的,则用户界面的外观会延迟几秒钟。用户不喜欢等待,并且由于等待,他们可能会认为您的应用通常很慢。

但是,例如,如果仅在用户发出绘图命令时调用的那些函数中导入Matplotlib,则启动时间会显着减少。用户不再感觉您的应用程序变得那么迟钝,这可能会带来更好的用户体验。