我有一个脚本,在我的本地计算机上运行大约需要10分钟。在脚本的开头,我必须构建一些非常大的列表并遍历它们以执行各种清理功能,这将创建清理数据的新列表。这样做有清除/保存记忆的标准方法吗?
我最初的想法是,一旦我完成使用它,只需将变量重置为空列表:
lst = [1,2,3, toinfinity..]
clean_lst = [x for x in l if x < infinity]
lst = []
cleaner_lst = [x for x in clean_lst if x > 100]
clean_lst = []
# etc...
答案 0 :(得分:1)
如果没有更大的代码上下文可以确定,很难知道这个答案是否有用,但假设不需要保留原始列表:
只需使用已清理的版本替换列表本身:
lst = [1,2,3, toinfinity..]
lst = [x for x in lst if x < infinity]
lst = [x for x in lst if x > 100]
通常,Python可以很好地处理垃圾收集。在这种情况下,再次假设您不需要原件,创建瞬态列表只是使用内存而无需使用。
答案 1 :(得分:1)
首先,如果我是你,我会描述我的代码,例如通过封装你在函数中提到的那些调用,然后调用
import cProfile
cProfile.run("my_function()")
之后,我将专注于你在帖子中请求的那些小优化(而不是专注于REAL性能猪!),我将上面的代码替换为:
some_list = [x for x in range(infinity) if x > 100 and x < infinity]
# replacing range with xrange in python2
但这只是我考虑将这些方括号转换为普通括号之前的一步,将我的列表转换为生成器。如果您对要求更加准确,也许我们可以做得更好。
例如,您提到您运行各种功能。为什么不用以下内容替换它:
def clean_some_data(data, cleanup_functions):
return [cleanup_function(data) for cleanup_function in cleanup_functions]
# or
def clean_some_data(data, cleanup_functions):
for cleanup_function in cleanup_function:
data = [cleanup_function(item) for item in data]
return data
有一些可能性,但需要更多细节