3

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

使用下面的代码,至少相关部分是我打算做什么的当前示例:

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

4 回答 4

4

导入模块不会浪费任何东西;该模块始终完全导入(到sys.modules映射中),因此无论您使用import ftplib还是from ftplib import FTP没有任何可能性。

在'import module' vs. 'from module import function'的跨站点重复问题上,我详细说明了为什么会这样以及导入模块对程序员的真正意义。

于 2013-08-01T16:51:23.783 回答
3

您应该尝试尽可能少地导入。IE

"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
于 2013-08-01T16:57:47.017 回答
2

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

于 2013-08-01T16:51:22.617 回答
2

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

语法有用并且有时首选的原因from <module> import <function>在您的代码中得到了证明:您不需要使用module.function语法,而是可以将模块函数用作本机函数,从而使您的代码更简洁。

于 2013-08-01T16:51:39.810 回答