python - 函数内部的对象在超出范围后不会被销毁,导致内存泄漏
问题描述
通常,我希望当局部变量超出范围时,应该从内存中收集它。在这里,我体验到了不一样的东西。我尝试循环运行 scikit-fuzzy 文档(此处)中给出的示例,但遇到内存泄漏。这是最小的例子,
from skfuzzy import control as ctrl
from pympler import muppy,tracker
import skfuzzy as fuzz
import numpy as np
import sys
def base_example():
quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality')
service = ctrl.Antecedent(np.arange(0, 11, 1), 'service')
tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip')
quality.automf(3)
service.automf(3)
tip['low'] = fuzz.trimf(tip.universe, [0, 0, 13])
tip['medium'] = fuzz.trimf(tip.universe, [0, 13, 25])
tip['high'] = fuzz.trimf(tip.universe, [13, 25, 25])
rule1 = ctrl.Rule(quality['poor'] | service['poor'], tip['low'])
rule2 = ctrl.Rule(service['average'], tip['medium'])
rule3 = ctrl.Rule(service['good'] | quality['good'], tip['high'])
tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])
tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
tipping.input['quality'] = 6.5
tipping.input['service'] = 9.8
tipping.compute()
if __name__ == '__main__':
tr = tracker.SummaryTracker() # to show the initial list of objects
for i in range(100000):
base_example()
if i%500==0: # we monitor different in the list of objects every 500 iterations
print('Iteration ',i)
tr.print_diff() # to show the difference beween this iteration and the base one
由于没有对象base_example
存储在全局变量中,我希望当函数base_example
到达末尾时,对象被删除并释放内存,但这里不会发生。有任何想法吗?
解决方案
推荐阅读
- vhdl - 如何减少 VHDL 设计中的 ALM 数量?
- ios - 从 XIB 创建自定义视图时,我们应该更喜欢使用 Bundle.main 还是 UINib?
- netlogo - NetLogo BehaviorSpace 崩溃 NetLogo
- javascript - 表上带有 ajax 调用的 Td 文本不清除以前的数据
- python - 为什么我的基本 CNN 模型没有过拟合分割图像数据集?
- django - 使用 Django 的 RingCentral OAuth
- java - 找不到 tools.jar。请检查 C:\Program Files\Java\jre1.8.0_271 是否包含有效的 JDK 安装
- python - 如何在使用字典列表而不是查询集填充 django-tables2 后对其进行过滤?
- ruby - 关闭 ruby 版本警告
- javascript - 酶安装不渲染任何东西