【发布时间】:2017-01-11 02:55:43
【问题描述】:
%reset
%reset -f
和
%reset_selective a
%reset_selective -f a
是Matlab命令“清除所有”的有用Python替代品,其中“-f”表示“强制而不要求确认”,“_selective”可以与
结合使用who_ls
有选择地删除工作区中的变量,如https://ipython.org/ipython-doc/3/interactive/magics.html 所示。
现在我正在管理循环,我将在其中定义大量变量,例如
for j in range(1000):
a = crazy_function1()
b = crazy_function2()
...
m = crazy_function18()
n = crazy_function19()
...
z = crazy_functionN()
在每个循环结束时,我想删除所有变量,除了 Python 工作区的标准变量和我引入的一些变量(在这个例子中只有 m 和 n)。这将避免污染和内存负担,从而使代码更加高效和安全。
我看到“who_ls”的结果看起来像一个列表,因此我想在一个循环中删除所有不等于 m 或 n 的变量
for j in range(1000):
a = crazy_function1()
b = crazy_function2()
...
m = crazy_function18()
n = crazy_function19()
...
z = crazy_functionN()
if who_ls[j] != m or who_ls[j] != n:
%reset_selective -f who_ls[j]
但它不起作用,因为 who_ls 看起来像一个列表,但它不像一个列表。您将如何修改最后几行代码? 有没有类似的
%reset_selective -f, except variables(m, n)
?
【问题讨论】:
-
为什么不将不必要的存储到字典或列表中呢?然后,您可以一次将其全部删除。您确定删除这些变量会更有效吗?我相信 MATLAB 不会将该内存还给操作系统,而且我不知道 ipython 的垃圾收集在同一场景中是如何工作的。
-
将所有不必要的变量存储在字典中是个好主意,我相信系统越复杂,您对它的控制就越少,最终,您不能拥有 100 % 控制你在做什么。出于这个原因,我认为删除不必要的变量很重要。
-
@Two-BitAlchemist 如果 ipython 的内存管理和交互式 shell 完全一样,那么 OK。但我很确定它不是(例如,考虑 ipython 中存在的历史和
Out[n]引用)。话题性是另一个问题,尽管我不相信特定于 ipython 的问题是题外话。无论如何,我们不必同意:) -
@AndrasDeak 对我来说,如果 OP 真的想要这样做(包括
Out在内的所有引用都已删除),我会认为这听起来像是不切实际的寻求清除 Python 的内存,我会承认这是一个可怕的欺骗目标。 -
@Two-BitAlchemist 坦率地说,我相信 OP 只是“想要高效”,并认为“删除不必要的变量”会有所帮助。无论这意味着什么,以及它实际上做了什么。