导入完整模块或我需要的内容以减少内存

时间:2013-08-01 16:48:27

标签: python

我在想是否与从模块中导入我需要的内容以减少任何脚本的内存消耗相关,或者我应该只导入所有内容?我相信如果我开始写这种方式可以消耗更多的时间写,但它值得吗?我的意思是,可以减少更多使用内存的机会吗?

使用下面的代码,只关注相关部分是我计划做的最新例子:

from ftplib import FTP as FTP_LIB
from ftplib.FTP import connect as FTP_CONNECT
from ftplib.FTP import login  AS FTP_LOGIN
from ftplib.FTP import cwd as FTP_CWD
from ftplib.FTP import storbinary as FTP_STORE_BIN
from ftplib.FTP import retrbinary as FTP_RETRIV_BIN
from ftplib.FTP import delete as FTP_DELETE
from ftplib.FTP import quit  as FTP_QUIT
from zipfile import ZipFile
from zipfile import ZIP_DEFLATED
from sys import exit as SYS_EXIT


#--------------------------------------------------------------------------
# FTP Download
#--------------------------------------------------------------------------
def get_file(self, iServer, ftpPort, login, pwd, fileName, path):
    parts = iServer.split(":")
    host = parts[0]
    ftp = FTP_LIB()
    try:
        FTP_CONNECT(host, ftpPort, 20)
        FTP_LOGIN(login, pwd)
        FTP_CWD(path)
        FTP_RETRIV_BIN('RETR ' + fileName, open(fileName, 'wb').write)
    except Exception, e:
        print "    Download failed : " + str(e)
        SYS_EXIT(1)
    finally:
        FTP_QUIT()

提前致谢。

4 个答案:

答案 0 :(得分:4)

导入模块不会浪费任何;该模块始终完全导入(进入sys.modules映射),因此无论您使用import ftplib还是from ftplib import FTP都没有赔率。

我在'import module' vs. 'from module import function'的跨站点重复问题上详细阐述了为什么这是导致模块真正意味着对程序员的影响。

答案 1 :(得分:3)

你应该尝试尽可能少地导入。即。

"from sys import a" is better than "from sys import *"

它背后的基本原理是,我们不会最终得到重复,因此事情不能按预期工作。目前已有相当数量的模块重复。因此,通过从多个包中导入所有内容,我们可能会更改错误的模块。

from modA import *
from modB import * 

what if subModA is available in both modA and modB. 

尽量避免使用"from modA import submodA as renamed_submodA"。这使得其他人难以理解代码。

我会重写你的可读性定义,如下所示,

from ftplib import FTP
from ftplib.FTP import connect, login, cwd, storbinary, retrbinary, delete, quit
from zipfile import ZipFile, ZIP_DEFLATED
from sys import exit as SYS_EXIT

答案 2 :(得分:2)

完整模块将加载一次,但没有子模块(如果它们不是由父模块导入的)

答案 3 :(得分:2)

导入所有内容和使用from语法之间没有性能差异。

您的代码中演示了from <module> import <function>语法有用且有时是首选的原因:您不需要使用module.function语法,而是可以将模块函数用作本机函数,你的代码更清洁。