我已经使用Python一段时间了,时不时遇到一些内存爆炸问题。我已经搜索了一些资源来解决我的问题,例如“内存分析嵌入式python”和https://mflerackers.wordpress.com/2012/04/12/fixing-and-avoiding-memory-leaks-in-python/和https: //docs.python.org/2/reference/datamodel.html#object。德尔然而,他们都不适合我。
我当前的问题是使用嵌入式功能时内存爆炸。以下代码可以正常工作:
class A:
def fa:
some operations
get dictionary1
combine dictionary1 to get string1
dictionary1 = None
return *string1*
def fb:
for i in range(0, j):
call self.fa
get dictionary2 by processing *string1*
# dictionary1 and dictionary2 are basically the same.
update *dictionary3* by processing dictionary2
dictionary2 = None
return *dictionary3*
class B:
def ga:
for n in range(0, m):
call A.fb # as one argument is updated dynamically, I have to call it within the loop
processes *dictoinary3*
return something
当我注意到不需要将dictionary1组合到string1时,就会引起问题,我可以直接将Dictionary1传递给A.fb。我以这种方式实现了它,然后程序变得非常慢,并且内存使用量激增了十倍以上。我已验证这两种方法均返回了正确的结果。
有人建议为什么这么小的修改会带来如此大的差异?
以前,当我在多源树中平衡节点时(拥有100,000多个节点),我也注意到了这一点。如果我从源节点(可能具有最大的高度)开始进行均衡,则内存使用量比源节点(可能具有最小的高度)的内存使用情况差100倍。平准化时间大致相同。
这让我很困惑。提前非常感谢您!
如果有兴趣的人,我可以通过电子邮件将源代码发送给您,以获得更清晰的解释。
您正在解决同一问题的事实并不意味着有关解决方案的效率。排序数组可能会遇到相同的问题:您可以使用bubble-sortO(n^2)
或merge-sort O(nlogn)
,或者,如果可以应用一些限制,则可以使用非比较排序算法,例如radix或bucket-sort,它们具有线性运行时间。
从不同的节点开始遍历将产生不同的遍历图的方式-其中一些可能无效(重复节点多次)。
至于“将dictionary1转换为string1”,这可能是一个非常昂贵的操作,并且由于(多次)递归调用此函数,因此性能可能会大大降低。但这只是一个有根据的猜测,如果不对这些功能中执行的操作的复杂性有更多的了解,就无法回答。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句